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