Abfrage nach verschachtelten JSON-Arrays in PostgreSQL
Einleitung:
Der JSON-Datentyp von PostgreSQL bietet umfassende Datenspeicher- und Abfragefunktionen. Eine häufige Herausforderung besteht darin, in JSON-Objekten gespeicherte Arrays abzufragen. Dieser Artikel bietet eine Schritt-für-Schritt-Anleitung zum Abfragen von Array-Elementen in JSON-Typen mit Schwerpunkt auf PostgreSQL 9.3 und höher.
JSON-Arrays in PostgreSQL 9.3 und höher abfragen:
json_array_elements() Funktion:
json_array_elements()
Die Funktion gibt eine horizontale Liste aller Elemente im JSON-Array zurück. Es kann mit lateralen Joins in der FROM-Klausel verwendet werden:
<code class="language-sql">SELECT data::text, obj FROM reports r, json_array_elements(r.data#>'{objects}') obj WHERE obj->>'src' = 'foo.png';</code>
Bitte beachten Sie, dass der Operator #>
verwendet wird, um auf verschachtelte Objekte in einem JSON-Array zuzugreifen.
Verschachtelte horizontale Verbindungen:
Ein anderer Ansatz ist die Verwendung verschachtelter lateraler Verknüpfungen:
<code class="language-sql">SELECT * FROM reports r, json_array_elements(r.data->'objects') obj WHERE obj->>'src' = 'foo.png';</code>
Diese Abfrage verwendet implizites JOIN LATERAL
und funktioniert ähnlich wie das vorherige Beispiel.
Abfragen mithilfe des GIN-Index optimieren (PostgreSQL 9.4):
Um die Abfrageleistung bei der Suche nach bestimmten Array-Elementen zu verbessern, wird empfohlen, jsonb_array_elements()
zu verwenden und einen GIN-Index für den JSON-Ausdruck data->'objects'
zu erstellen:
<code class="language-sql">CREATE INDEX reports_data_gin_idx ON reports USING gin ((data->'objects') jsonb_path_ops); SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';</code>
@>
-Operator prüft die Einbeziehung und erfordert, dass die JSON-Struktur in eckige Klammern eingeschlossen wird.
Zusätzliche Hinweise:
->
, ->>
und #>
werden für den Zugriff auf verschachtelte JSON-Objekte und -Arrays verwendet. Das obige ist der detaillierte Inhalt vonWie frage ich verschachtelte JSON-Arrays in PostgreSQL ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!