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