jsonb в Postgres 9.4+
Вие можете използвайте същата заявка като по-долу, само с jsonb_array_elements() .
Но по-скоро използвайте jsonb "съдържа" оператор @> в комбинация със съвпадащ GIN индекс на израза 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"}]';
Тъй като ключът objects съдържа JSON масив , трябва да съпоставим структурата в думата за търсене и също да увием елемента на масива в квадратни скоби. Пуснете скобите на масива, когато търсите обикновен запис.
Още обяснения и опции:
- Индекс за намиране на елемент в JSON масив
json в Postgres 9.3+
Изключете JSON масива с функцията json_array_elements() в странично съединение в FROM клауза и тест за нейните елементи:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db<>цигулка тук
Стар sqlfiddle
Или еквивалентно само на единично ниво на гнездене:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->>код> , ->код> и #> операторите са обяснени в ръководството.
И двете заявки използват имплицитно JOIN LATERAL .
Тясно свързани:
- Запитване за елемент от масив в колона JSON