json_array_elements(...)
geeft een set terug, en dat geldt ook voor het resultaat van het toepassen van ->>
en =
naar het stel. Let op:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Je zou verwachten dat je gewoon '123' = ANY (...)
. kunt schrijven maar dat wordt helaas niet ondersteund zonder een array-invoer. Verrassend genoeg is dat ook niet '123' IN (...)
, iets wat ik denk dat we moeten oplossen.
Dus ik zou LATERAL
. gebruiken . Hier is een manier waarop een bedrijfs-ID meerdere keren wordt geretourneerd als deze meerdere overeenkomsten heeft:
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';