json_array_elements(...)
връща набор, както и резултатът от прилагането на ->>
и =
към комплекта. Спазвайте:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Очаквате просто да можете да напишете '123' = ANY (...)
но това не се поддържа без въвеждане на масив, за съжаление. Изненадващо, нито '123' IN (...)
, нещо, което мисля, че ще трябва да поправим.
Така че бих използвал LATERAL
. Ето един начин, който ще върне ИД на фирма многократно, ако има множество съвпадения:
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';