jsonb
w Postgresie 9.4+
możesz użyj tego samego zapytania, co poniżej, tylko z jsonb_array_elements()
.
Ale raczej użyj jsonb
"zawiera" operator @>
w połączeniu z pasującym indeksem GIN w wyrażeniu 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"}]';
Ponieważ klucz obiekty
przechowuje tablicę JSON , musimy dopasować strukturę w wyszukiwanym terminie i umieścić element tablicy w nawiasach kwadratowych. Upuść nawiasy tablicowe podczas przeszukiwania zwykłego rekordu.
Więcej wyjaśnień i opcji:
- Indeks do znajdowania elementu w tablicy JSON
json
w Postgresie 9.3+
Rozpakuj tablicę JSON za pomocą funkcji json_array_elements()
w sprzężeniu bocznym w FROM
klauzula i przetestuj jej elementy:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db<>graj tutaj
Stary sqlfiddle
Lub odpowiednik tylko singla poziom zagnieżdżenia:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->> ,
-> i
#>
operatorzy są wyjaśnieni w instrukcji.
Oba zapytania używają niejawnego JOIN LATERAL
.
Ściśle powiązane:
- Zapytanie o element tablicy w kolumnie JSON