Sử dụng ANY
để kiểm tra xem mảng jsonb có chứa bất kỳ các giá trị phù hợp, có thể là một mảng hoặc một truy vấn con, sử dụng ví dụ sqlfiddle của bạn
SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)
Bạn cũng có thể chuyển một ký tự mảng, trong trường hợp này, nó sẽ yêu cầu một mảng các giá trị JSONB, tức là phía bên phải của @>
có thể được thay thế bằng chữ ANY('{123,456}'::JSONB[])
Ngoài ra, hãy sử dụng &&
để kiểm tra sự chồng chéo của mảng. Đầu tiên cần phải chuyển đổi mảng JSON / JSONB thành mảng gốc
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}'
Bạn cũng có thể thay thế mảng chữ '{123, 456}'
với truy vấn con trả về một mảng số nguyên, chẳng hạn như (SELECT ARRAY_AGG(data_id) FROM tableB)
Một tùy chọn khác sẽ là sử dụng hoặc trong mệnh đề where của bạn
select *
from tableA
where (data->'sequence') @> '[456]'
or (data->'sequence') @> '[123]'