sqlc icon indicating copy to clipboard operation
sqlc copied to clipboard

Map slice elements into clauses

Open richardhuaaa opened this issue 1 year ago • 1 comments

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 avatar Sep 04 '24 00:09 richardhuaaa

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)
...;

richardhuaaa avatar Sep 04 '24 21:09 richardhuaaa