Použijte ANY
až k otestování, zda pole jsonb obsahuje nějaké správných hodnot, což může být pole nebo poddotaz, použijte svůj příklad sqlfiddle
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Můžete také předat literál pole, v tomto případě by to vyžadovalo pole hodnot JSONB, tj. pravá strana @>
lze nahradit doslovným ANY('{123,456}'::JSONB[])
Případně použijte &&
otestovat překrytí pole. Nejprve je nutné převést pole JSON/JSONB na nativní pole
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}'
Můžete také nahradit literál pole '{123, 456}'
s poddotazem, který vrací pole celých čísel, například (SELECT ARRAY_AGG(data_id) FROM tableB)
Další možností by bylo použít nebo ve vaší klauzuli where
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'