Använd ANY
till för att testa om jsonb-arrayen innehåller någon av de rätta värdena, som kan vara en array eller en underfråga, med ditt sqlfiddle-exempel
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Du kan också skicka en array-literal, i det här fallet skulle det kräva en array med JSONB-värden, det vill säga den högra sidan av @>
kan ersättas med bokstaven ANY('{123,456}'::JSONB[])
Alternativt, använd &&
för att testa för arrayöverlappning. Det är först nödvändigt att konvertera JSON/JSONB-arrayen till en inbyggd 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 också ersätta arrayliteralen '{123, 456}'
med en underfråga som returnerar en matris med heltal, till exempel (SELECT ARRAY_AGG(data_id) FROM tableB)
Ett annat alternativ skulle vara att använda eller i din where-klausul
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'