json_array_elements(...) mengembalikan satu set, dan begitu juga hasil penerapan ->> dan = ke himpunan. Perhatikan:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Anda diharapkan hanya dapat menulis '123' = ANY (...) tapi sayangnya itu tidak didukung tanpa input array. Anehnya, tidak juga '123' IN (...) , sesuatu yang menurut saya harus kita perbaiki.
Jadi, saya akan menggunakan LATERAL . Berikut salah satu caranya, yang akan mengembalikan ID perusahaan beberapa kali jika memiliki beberapa kecocokan:
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';