Utilisez ANY
to pour tester si le tableau jsonb contient any des bonnes valeurs, qui peuvent être un tableau ou une sous-requête, en utilisant votre exemple sqlfiddle
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Vous pouvez également passer un tableau littéral, dans ce cas, il faudrait un tableau de valeurs JSONB, c'est-à-dire le côté droit de @>
pourrait être remplacé par le littéral ANY('{123,456}'::JSONB[])
Sinon, utilisez le &&
pour tester le chevauchement des tableaux. Il faut d'abord convertir le tableau JSON/JSONB en tableau natif
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}'
Vous pouvez également remplacer le littéral de tableau '{123, 456}'
avec une sous-requête qui renvoie un tableau d'entiers, comme (SELECT ARRAY_AGG(data_id) FROM tableB)
Une autre option serait d'utiliser ou dans votre clause where
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'