Gebruik ANY
to om te testen of de jsonb-array elke . bevat van de juiste waarden, die een array of een subquery kunnen zijn, met behulp van uw sqlfiddle-voorbeeld
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
U kunt ook een letterlijke array doorgeven, in dit geval is een reeks JSONB-waarden vereist, d.w.z. de rechterkant van @>
kan worden vervangen door de letterlijke ANY('{123,456}'::JSONB[])
Of gebruik de &&
om te testen op array-overlap. Het is eerst nodig om de JSON/JSONB-array te converteren naar een 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}'
U kunt ook de letterlijke array '{123, 456}'
. vervangen met een subquery die een array van gehele getallen retourneert, zoals (SELECT ARRAY_AGG(data_id) FROM tableB)
Een andere optie zou zijn om of in uw waar-clausule te gebruiken
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'