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';