Abfrage nach Array-Elementen innerhalb des JSON-Typs
Ich versuche zu testen, die json
Typ in PostgreSQL 9.3.
Ich habe eine json
Spalte namens data
in einer Tabelle namens reports
. Das JSON sieht wie folgt aus:
{
"objects": [
{"src":"foo.png"},
{"src":"bar.png"}
],
"background":"background.png"
}
Ich würde gerne die Abfrage der Tabelle, die für alle Berichte, die mit dem 'src' Wert in den 'objects' array. Zum Beispiel ist es möglich, die Abfrage der DB für alle Berichte, die übereinstimmung 'src' = 'foo.png'
? Ich erfolgreich schrieb eine Abfrage, kann sich mit der "background"
:
SELECT data AS data FROM reports where data->>'background' = 'background.png'
Aber da "objects"
hat ein array von Werten, ich kann nicht scheinen, etwas zu schreiben, das funktioniert. Ist es möglich, die Abfrage der DB für alle Berichte, die übereinstimmung 'src' = 'foo.png'
? Ich habe mir durch diese Quellen aber kann immer noch nicht bekommen:
- http://www.postgresql.org/docs/9.3/static/functions-json.html
- Wie kann ich die Abfrage unter Verwendung der Felder in der neuen PostgreSQL mit JSON-Datentyp?
- http://michael.otacoo.com/postgresql-2/postgres-9-3-feature-highlight-json-operators/
Ich habe auch versucht Dinge wie diese, aber ohne Erfolg:
SELECT json_array_elements(data->'objects') AS data from reports
WHERE data->>'src' = 'foo.png';
Ich bin kein SQL-Experte, also weiß ich nicht was ich falsch mache.
InformationsquelleAutor der Frage pacothelovetaco | 2014-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
json
in Postgres 9.3+Unnest die JSON-array mit der Funktion
json_array_elements()
in eine seitliche Verknüpfung in derFROM
- Klausel und test für die Elemente:Den WAK (
WITH
Abfrage) nur Ersatz für eine Tabellereports
.Oder, gleichwertig, nur für einen single Ebene der Verschachtelung:
->>
->
und#>
- Operatoren sind in der Anleitung erklärt.Beide Abfragen, verwenden Sie eine implizite
JOIN SEITLICHEN
.SQL Fiddle.
Eng verwandt Antwort:
jsonb
in Postgres 9.4+Verwenden Sie die entsprechende
jsonb_array_elements()
.Besser noch, verwenden Sie die neue "enthält" - operator
@>
(am besten in Kombination mit einem passenden GIN-index auf die expressiondata->'objects'
):Da der Schlüssel
objects
hält ein JSON - arraymüssen wir mit der Struktur in den Suchbegriff ein und wickeln Sie die array-Elemente in eckigen Klammern, zu. Fallen die array-Klammern bei der Suche nach einem einfachen Datensatz.Ausführliche Erklärung und weitere Optionen:
InformationsquelleAutor der Antwort Erwin Brandstetter
Erstellen Sie eine Tabelle mit Spalte als Typ json
Nun fügen Sie json-Daten
Nun lassen Sie uns einige Abfragen zum abrufen von Daten
Haben Sie vielleicht bemerkt, dass die Ergebnisse kommt mit Hochkomma( " ) und eckigen Klammern ([ ])
Nun nur abrufen der Werte benutzen Sie einfach
->>
InformationsquelleAutor der Antwort Sandip Debnath