json_array_elements(...)
restituisce un set, così come il risultato dell'applicazione di ->>
e =
al set. Osserva:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Ti aspetteresti di essere in grado di scrivere '123' = ANY (...)
ma sfortunatamente non è supportato senza un input di array. Sorprendentemente, nemmeno '123' IN (...)
, qualcosa che penso dovremo sistemare.
Quindi, userei LATERAL
. Ecco un modo, che restituirà un ID azienda più volte se ha più corrispondenze:
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';