json_array_elements(...)
vrátí sadu a stejně tak i výsledek použití ->>
a =
do sady. Všimněte si:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Očekávali byste, že budete schopni napsat pouze '123' = ANY (...)
ale to bohužel není podporováno bez vstupu pole. Překvapivě není ani '123' IN (...)
, něco, co si myslím, že budeme muset opravit.
Takže bych použil LATERAL
. Zde je jeden způsob, který vrátí ID společnosti vícekrát, pokud má více shod:
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';