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

Requête pour les éléments de tableau dans le type JSON

jsonb dans Postgres 9.4+

Vous pouvez utilisez la même requête que ci-dessous, juste avec jsonb_array_elements() .

Mais utilisez plutôt le jsonb opérateur "contient" @> en combinaison avec un index GIN correspondant sur l'expression data->'objects' :

CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);

SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';

Puisque la clé objects contient un tableau JSON , nous devons faire correspondre la structure dans le terme de recherche et placer également l'élément du tableau entre crochets. Supprimez les parenthèses du tableau lors de la recherche d'un enregistrement brut.

Plus d'explications et d'options :

  • Index pour trouver un élément dans un tableau JSON

json dans Postgres 9.3+

Désimbriquer le tableau JSON avec la fonction json_array_elements() dans une jointure latérale dans le FROM clause et test de ses éléments :

SELECT data::text, obj
FROM   reports r, json_array_elements(r.data#>'{objects}') obj
WHERE  obj->>'src' = 'foo.png';

db<>jouez ici
Vieux sqlfiddle

Ou, équivalent pour juste un célibataire niveau d'imbrication :

SELECT *
FROM   reports r, json_array_elements(r.data->'objects') obj
WHERE  obj->>'src' = 'foo.png';

->> , -> et #> les opérateurs sont expliqués dans le manuel.

Les deux requêtes utilisent un JOIN LATERAL implicite .

Etroitement lié :

  • Requête pour l'élément du tableau dans la colonne JSON