0
votes

So I had a statement:

SELECT jsonb_build_object(
            'type',       'Feature',
            'geometry',   ST_AsGeoJSON(line)::jsonb,
            'properties', to_jsonb(inputs) - 'line'
        ) as feature from (select line, line_types from table_a) inputs;

which worked fine except the select statement inside the FROM clause was returning too many rows. So I want to just FETCH to just do x rows at a time. I declared a cursor on select line, line_types from table_a and when I did FETCH FORWARD 5 FROM mycur; it returned the first 5 rows. Yet when I try to replace the select with fetch, it won't let me:

SELECT jsonb_build_object(
            'type',       'Feature',
            'geometry',   ST_AsGeoJSON(line)::jsonb,
            'properties', to_jsonb(inputs) - 'line'
        ) from (FETCH 1 FROM mycur) inputs;
ERROR:  syntax error at or near "FETCH"
LINE 5:         ) from (FETCH 1 FROM mycur) inputs;
                        ^

i assume you can't use fetch in a subquery? I tried

SELECT jsonb_build_object(
            'type',       'Feature',
            'geometry',   ST_AsGeoJSON(line)::jsonb,
            'properties', to_jsonb(inputs) - 'line'
        ) as feature from (select FETCH 1 FROM mycur) inputs;
ERROR:  syntax error at or near "1"
LINE 5:         ) as feature from (select FETCH 1 FROM mycur) inputs...
                                                ^

I do see that you can use just the FETCH statement in SELECT but thats not really what I want like:

SELECT jsonb_build_object(
            'type',       'Feature',
            'geometry',   ST_AsGeoJSON(line)::jsonb,
            'properties', to_jsonb(inputs) - 'line'
        ) as feature from (select line, line_type from table_a fetch first 10 rows only) inputs;

is there now way to use FETCH FROM Cursor as a subquery?

1

1 Answers

0
votes

No, using FETCH in a subquery is not possible.

You should look into using keyset pagination:

Let's assume that the primary key of table_a is id.

Then you start with

SELECT jsonb_build_object(...) AS feature,
       id
FROM (SELECT line, line_type
      FROM table_a
      ORDER BY id
      FETCH FIRST 10 ROWS ONLY) AS inputs;

similar to what you have in mind.

Now remember the highest id returned from that query; I'll call it last_id in the following.

Fetch the next ten rows with

SELECT jsonb_build_object(...) AS feature,
       id
FROM (SELECT line, line_type
      FROM table_a
      WHERE id > last_id
      ORDER BY id
      FETCH FIRST 10 ROWS ONLY) AS inputs;

This can be repeated to fetch more pages of 10 rows as needed.

The beauty of the method is that it uses the primary key index for high efficiency.