json_array_elements(...)
trả về một tập hợp và kết quả của việc áp dụng ->>
cũng vậy và =
đến bộ. Quan sát:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Bạn mong đợi chỉ có thể viết '123' = ANY (...)
nhưng điều đó không được hỗ trợ nếu không có đầu vào mảng, thật không may. Đáng ngạc nhiên là '123' IN (...)
cũng không , điều mà tôi nghĩ chúng ta sẽ phải sửa.
Vì vậy, tôi sẽ sử dụng LATERAL
. Đây là một cách, sẽ trả về một ID công ty nhiều lần nếu nó có nhiều kết quả trùng khớp:
CREATE TABLE company AS SELECT 1 AS id, '[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]'::json AS accounts;
SELECT id
FROM company c,
LATERAL json_array_elements(c.accounts) acc
WHERE acc ->> 'account_id' = '123';