Brug ANY
til for at teste om jsonb-arrayet indeholder nogen af de rigtige værdier, som kan være et array eller en underforespørgsel, ved hjælp af dit sqlfiddle-eksempel
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Du kan også sende en array literal, i dette tilfælde ville det kræve en matrix af JSONB-værdier, dvs. højre side af @>
kunne erstattes med bogstavet ANY('{123,456}'::JSONB[])
Alternativt kan du bruge &&
for at teste for matrixoverlapning. Det er først nødvendigt at konvertere JSON/JSONB-arrayet til et native-array
SELECT tableA.*
FROM tableA
JOIN LATERAL (
SELECT ARRAY_AGG(v::INT) y
FROM JSONB_ARRAY_ELEMENTS_TEXT(data->'sequence') v
) x ON TRUE
WHERE x.y && '{123, 456}'
Du kan også erstatte array-literalen '{123, 456}'
med en underforespørgsel, der returnerer en matrix af heltal, såsom (SELECT ARRAY_AGG(data_id) FROM tableB)
En anden mulighed ville være at bruge eller i din where-klausul
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'