PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfrage nach Array-Elementen innerhalb des JSON-Typs

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