jsonb
in Postgres 9.4+
Sie können Verwenden Sie dieselbe Abfrage wie unten, nur mit jsonb_array_elements()
.
Verwenden Sie aber lieber den jsonb
"enthält"-Operator @>
in Kombination mit einem passenden GIN-Index auf den Ausdruck 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"}]';
Da die Schlüssel objects
enthält ein JSON-Array , müssen wir die Struktur im Suchbegriff abgleichen und das Array-Element ebenfalls in eckige Klammern setzen. Lassen Sie die Array-Klammern weg, wenn Sie nach einem einfachen Datensatz suchen.
Weitere Erklärungen und Optionen:
- Index zum Auffinden eines Elements in einem JSON-Array
json
in Postgres 9.3+
Entschachteln Sie das JSON-Array mit der Funktion json_array_elements()
in einem lateralen Join im FROM
-Klausel und Test auf ihre Elemente:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db<>hier fummeln
Altes sqlfiddle
Oder das Äquivalent für nur eine Single Verschachtelungsebene:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->>
, ->
und #>
Operatoren werden im Handbuch erklärt.
Beide Abfragen verwenden ein implizites JOIN LATERAL
.
Eng verwandt:
- Abfrage nach Element des Arrays in JSON-Spalte