sqlc-dev / sqlc

Generate type-safe code from SQL
https://sqlc.dev
MIT License
13.54k stars 809 forks source link

Map slice elements into clauses #3578

Open richardhuaaa opened 2 months ago

richardhuaaa commented 2 months ago

What do you want to change?

Is there any support for passing a slice of variable length and mapping it into clauses of a postgres query, like in this pseudo-code?

SELECT
  ...
WHERE
   ...
   AND (originator_node_id NOT IN $1::int[]
     OR (originator_node_id = $1[0] AND originator_sequence_id > $2[0])
     OR (originator_node_id = $1[1] AND originator_sequence_id > $2[1])
     ...
     );

What database engines need to be changed?

PostgreSQL

What programming language backends need to be changed?

Go

richardhuaaa commented 2 months ago

For anyone else in the same situation, I've found a workaround, although I'm unsure yet how the performance compares:

WITH cursors AS (
    SELECT
        UNNEST(@cursor_node_ids::INT[]) AS cursor_node_id,
        UNNEST(@cursor_sequence_ids::BIGINT[]) AS cursor_sequence_id
)
SELECT
    envelopes.*
FROM
    envelopes
    LEFT JOIN cursors ON envelopes.originator_node_id = cursors.cursor_node_id
WHERE ...
AND (cursor_sequence_id IS NULL
    OR envelopes.originator_sequence_id > cursor_sequence_id)
...;