jsonb
i Postgres 9.4+
Du kan brug den samme forespørgsel som nedenfor, bare med jsonb_array_elements()
.
Men brug hellere jsonb
"indeholder" operatoren @>
i kombination med et matchende GIN-indeks på udtrykket data->'objekter'
:
CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);
SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';
Siden nøglen objekter
har et JSON array , er vi nødt til at matche strukturen i søgeordet og også pakke array-elementet ind i firkantede parenteser. Slip array-parenteserne, når du søger efter en almindelig post.
Flere forklaringer og muligheder:
- Indeks til at finde et element i et JSON-array
json
i Postgres 9.3+
Fjern JSON-arrayet med funktionen json_array_elements()
i en lateral sammenføjning i FROM
klausul og test for dens elementer:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db<>spil her
Gamle sqlfiddle
Eller tilsvarende for bare en enkelt Indlejringsniveau:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->> ,
-> og
#> operatører er forklaret i manualen.
Begge forespørgsler bruger en implicit JOIN LATERAL
.
Nært beslægtet:
- Forespørgsel efter element af array i JSON-kolonnen