Verwenden Sie ANY
to, um zu testen, ob das jsonb-Array beliebige enthält der richtigen Werte, die ein Array oder eine Unterabfrage sein können, unter Verwendung Ihres sqlfiddle-Beispiels
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Sie können auch ein Array-Literal übergeben, in diesem Fall wäre ein Array von JSONB-Werten erforderlich, d. h. die rechte Seite von @>
könnte durch das Literal ANY('{123,456}'::JSONB[])
ersetzt werden
Verwenden Sie alternativ den &&
um auf Array-Überlappung zu testen. Zuerst muss das JSON/JSONB-Array in ein natives Array konvertiert werden
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}'
Sie können auch das Array-Literal '{123, 456}'
ersetzen mit einer Unterabfrage, die ein Array von Ganzzahlen zurückgibt, wie z. B. (SELECT ARRAY_AGG(data_id) FROM tableB)
Eine andere Option wäre die Verwendung von oder in Ihrer where-Klausel
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'