json_array_elements(...)
renvoie un ensemble, ainsi que le résultat de l'application de ->>
et =
à l'ensemble. Observe :
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Vous vous attendriez à pouvoir écrire '123' = ANY (...)
mais ce n'est pas pris en charge sans une entrée de tableau, malheureusement. Étonnamment, '123' IN (...)
n'est pas non plus , quelque chose que je pense que nous allons devoir corriger.
Donc, j'utiliserais LATERAL
. Voici une méthode qui renverra un ID d'entreprise plusieurs fois s'il a plusieurs correspondances :
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';