PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Interroger des données dans le champ de données de tableau JSON

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