Usa ANY
a per verificare se l'array jsonb contiene qualsiasi dei valori corretti, che possono essere un array o una sottoquery, usando il tuo esempio sqlfiddle
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Puoi anche passare un array letterale, in questo caso richiederebbe un array di valori JSONB, ovvero il lato destro di @>
potrebbe essere sostituito con il letterale ANY('{123,456}'::JSONB[])
In alternativa, usa il &&
per verificare la sovrapposizione di array. È prima necessario convertire l'array JSON/JSONB in un array nativo
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}'
Puoi anche sostituire l'array letterale '{123, 456}'
con una sottoquery che restituisce un array di numeri interi, come (SELECT ARRAY_AGG(data_id) FROM tableB)
Un'altra opzione sarebbe quella di utilizzare o nella tua clausola where
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'