jsonb
v Postgres 9.4+
můžete použijte stejný dotaz jako níže, pouze s jsonb_array_elements()
.
Ale raději použijte jsonb
operátor "obsahuje" @>
v kombinaci s odpovídajícím GIN indexem ve výrazu 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"}]';
Protože klíč objects
obsahuje pole JSON , musíme porovnat strukturu ve hledaném výrazu a také zabalit prvek pole do hranatých závorek. Při prohledávání prostého záznamu odstraňte závorky pole.
Další vysvětlení a možnosti:
- Index pro nalezení prvku v poli JSON
json
v Postgres 9.3+
Zrušte vnoření pole JSON pomocí funkce json_array_elements()
v bočním spojení v FROM
klauzule a test na její prvky:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db<>zde hrajte
Starý sqlfiddle
Nebo ekvivalentní pro jednotlivé úroveň vnoření:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->>
, ->
a #>
operátory jsou vysvětleny v příručce.
Oba dotazy používají implicitní JOIN LATERAL
.
Úzce související:
- Dotaz na prvek pole ve sloupci JSON