jsonb
in Postgres 9.4+
Je kunt gebruik dezelfde query als hieronder, alleen met jsonb_array_elements()
.
Maar gebruik liever de jsonb
"bevat" operator @>
in combinatie met een bijpassende GIN-index op de uitdrukking 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"}]';
Aangezien de sleutel objects
bevat een JSON array , moeten we overeenkomen met de structuur in de zoekterm en het array-element ook tussen vierkante haken plaatsen. Laat de array-haakjes vallen bij het zoeken naar een gewoon record.
Meer uitleg en opties:
- Index voor het vinden van een element in een JSON-array
json
in Postgres 9.3+
Unnest de JSON-array met de functie json_array_elements()
in een laterale verbinding in de FROM
clausule en test voor zijn elementen:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db<>viool hier
Oude sqlfiddle
Of, equivalent voor slechts een enkele niveau van nesten:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->>
, ->
en #>
operators worden uitgelegd in de handleiding.
Beide zoekopdrachten gebruiken een impliciete JOIN LATERAL
.
Nauw verwant:
- Query voor element van array in JSON-kolom