2016-10-03 4 views
0

Ich habe eine Anforderung zum Parsen der eingehenden Daten & erhalten Sie die Werte für bestimmte Schlüssel. Ich benutze JSON_VALUE für das gleiche mit der Annahme, dass meine Daten vom Clob-Typ wären.Kann JSON_VALUE mehrere Werte zurückgeben

{"REGION": "AMR", "CNTRY": "US"} 

Wenn ich brauche mehrere REGION wie „AMR“ und „EUR“ (Ex: User selects 2 regions in the UI but selects only one country), kann ich JSON_VALUE bekommen die Werte aus der clob zu bekommen? Wenn ja, wie sollte das Format des clob sein.

Antwort

0

Die Antwort auf Ihre Frage hängt davon ab, wie die JSON-Dokumente strukturiert sind. Aber zuerst, ja, Sie können alle JSON-Werte aus den Datentypen VARCHAR2, BLOB und CLOB erhalten.

Ich gehe davon aus, je nachdem, wie Sie die Anforderung erklärt, die Struktur des JSON wird mit einer Reihe von Regionen kommen, die in sich selbst Objekte sind, wie Sie oben hingewiesen. Also lassen Sie uns sagen, dass Sie eine JSON wie dieses:

{ 
    "REGIONS": [ 
     {"REGION": "AMR", "CNTRY": "US"}, 
     {"REGION": "EUR", "CNTRY": "AT"} 
    ] 
} 

In einem solchen Fall JSON_VALUE nicht ausreichend ist, mehr als JSON_VALUE ausgelegt ist, einen bestimmten skalaren Wert aus einem JSON-Dokument zu erhalten (beachten Sie, dass Oracle 12.2 will have significant enhancements in diesem Bereich). Aber im obigen Fall müssen Sie dieses Array von Objekten tatsächlich in relationale Zeilen modellieren, d. H. (Sie haben ein JSON-Dokument, aber ein Array von Einträgen, die jeweils zu einer Zeile werden sollten). In diesem Fall müssen Sie JSON_TABLE verwenden, um die Zeilen zu generieren. So zum Beispiel über eine Abfrage wie schreiben:

CREATE TABLE customers (doc CLOB CONSTRAINT doc_valid_json CHECK (doc IS JSON)); 
INSERT INTO customers (doc) VALUES (' 
{ 
    "REGIONS": [ 
     {"REGION": "AMR", "CNTRY": "US"}, 
     {"REGION": "EUR", "CNTRY": "AT"} 
    ] 
}'); 

COMMIT; 

SELECT jt.region, jt.cntry 
    FROM customers c, JSON_TABLE(c.doc, '$.REGIONS[*]' 
            COLUMNS (region VARCHAR2(3) PATH '$.REGION', 
              cntry VARCHAR2(2) PATH '$.CNTRY')) jt; 

Die SQL oben auf das tun FROM-Klausel folgende ab: Es liest die Tabelle customers die unsere JSON doc als CLOB dokumentiert die Spalte enthält . Als nächstes wendet es den Operator JSON_TABLE an, der ein paar Tricks für uns ausführt. Zuerst müssen wir die Spalte mit dem JSON-Dokument übergeben, in unserem Fall die Spalte doc. Dann können wir ihm ein Pfadpräfix geben, d. H. Einen Mechanismus, so dass wir nicht den gesamten Pfad immer wieder wiederholen müssen. Wir sagen JSON_TABLE, dass wir nur alle Elemente betrachten wollen, die im Array für "REGIONS" kommen, markieren Sie [*]. Als letzten Schritt müssen wir JSON_TABLE mitteilen, wie diese Elemente in der relationalen Welt aussehen sollen, d. H. Welche Spaltennamen und Datentypen wir verwenden wollen. Dies geschieht über das Schlüsselwort COLUMNS. wir geben an, dass wir die Spalten region und cntry sowohl vom Typ VARCHAR2 als auch vom Pfad innerhalb des JSON-Dokuments haben möchten. Wie wir bereits gesagt JSON_TABLE, dass wir nur an den Array-Elementen REGIONEN über '$.REGIONS[*]' aussehen wollen, können wir jetzt nur noch die Elemente des Arrays gehen und wählen, in diesem Fall $.REGION und $.CNTRY. Die nächsten Schritte sind einfach. Zuerst definieren wir einen Tabellenalias für JSON_TABLE, in diesem Fall jt. Wenn wir nun zum SELECT-Teil zurückkehren, können wir einfach jene zwei Spalten auswählen, die wir gerade aus dem JSON-Dokument SELECT jt.region, jt.cntry generiert haben.

Sie können schauen und das obige Beispiel in LiveSQL.oracle.com

ausprobieren
Verwandte Themen