Use
ANY
para testar se o array jsonb contém qualquer dos valores corretos, que podem ser uma matriz ou uma subconsulta, usando seu exemplo sqlfiddle SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Você também pode passar um literal de array, neste caso seria necessário um array de valores JSONB, ou seja, o lado direito de
@>
pode ser substituído pelo literal ANY('{123,456}'::JSONB[])
Como alternativa, use o
&&
para testar a sobreposição de matriz. Primeiro é necessário converter o array JSON/JSONB em um 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}'
Você também pode substituir o literal de matriz
'{123, 456}'
com uma subconsulta que retorna um array de inteiros, como (SELECT ARRAY_AGG(data_id) FROM tableB)
Outra opção seria usar ou na sua cláusula where
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'