Използвайте ANY
до, за да проверите дали масивът jsonb съдържа всеки на правилните стойности, които могат да бъдат масив или подзаявка, използвайки вашия пример за sqlfiddle
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Можете също така да подадете литерал на масив, в този случай това ще изисква масив от JSONB стойности, т.е. дясната страна на @>
може да се замени с литерала ANY('{123,456}'::JSONB[])
Като алтернатива използвайте &&
за тестване за припокриване на масиви. Първо е необходимо да преобразувате JSON/JSONB масива в естествен масив
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}'
Можете също да замените литерала на масива '{123, 456}'
с подзаявка, която връща масив от цели числа, като (SELECT ARRAY_AGG(data_id) FROM tableB)
Друг вариант би бил да използвате или във вашата клауза where
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'