jsonb
i Postgres 9.4+
Du kan använd samma fråga som nedan, bara med jsonb_array_elements()
.
Men använd hellre jsonb
"innehåller" operatorn @>
i kombination med ett matchande GIN-index på uttrycket data->'objekt'
:
CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);
SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';
Eftersom nyckeln objekt
har en JSON array , måste vi matcha strukturen i söktermen och linda in arrayelementet i hakparenteser också. Släpp arrayparenteserna när du söker efter en vanlig post.
Mer förklaring och alternativ:
- Index för att hitta ett element i en JSON-array
json
i Postgres 9.3+
Avnesta JSON-arrayen med funktionen json_array_elements()
i en lateral sammanfogning i FROM
klausul och test för dess beståndsdelar:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db<>spela här
Gammal sqlfiddle
Eller motsvarande för bara en singel nivå av kapsling:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->> ,
-> och
#> operatörer förklaras i manualen.
Båda frågorna använder en implicit JOIN LATERAL
.
Närbesläktade:
- Fråga efter element av array i JSON-kolumnen