In der Oracle-Datenbank die JSON_QUERY()
Die Funktion wählt einen oder mehrere Werte aus JSON-Daten aus und gibt sie zurück und gibt diese Werte zurück.
Sie können die Funktion verwenden, um Fragmente eines JSON-Dokuments abzurufen.
Syntax
Die Syntax sieht so aus:
JSON_QUERY
( expr [ FORMAT JSON ], JSON_basic_path_expression
[ JSON_query_returning_clause ] [ JSON_query_wrapper_clause ]
[ JSON_query_on_error_clause ] [ JSON_query_on_empty_clause ]
)
Wo:
expr
ist das JSON-Dokument, das Sie abfragen möchtenJSON_basic_path_expression
ist der SQL/JSON-Pfad, den Sie von diesem JSON-Dokument zurückgeben möchten. Die Funktion verwendet den Pfadausdruck, umexpr
auszuwerten und finden Sie einen oder mehrere JSON-Werte, die mit dem Pfadausdruck übereinstimmen oder ihn erfüllen. Der Pfadausdruck muss ein Textliteral sein.JSON_query_returning_clause
gibt den Datentyp und das Format der von der Funktion zurückgegebenen Zeichenfolge an.JSON_query_wrapper_clause
steuert, ob die Funktion die zurückgegebenen Werte in einen Array-Wrapper umschließt (eckige Klammern ([]
)).JSON_query_on_error_clause
gibt den Wert an, der zurückgegeben wird, wenn bestimmte Fehler auftreten.JSON_query_on_empty_clause
gibt den zurückgegebenen Wert an, wenn bei der Auswertung der JSON-Daten mithilfe des SQL/JSON-Pfadausdrucks keine Übereinstimmung gefunden wird.
Eine detaillierte Erläuterung der optionalen Klauseln finden Sie in der Oracle-Dokumentation.
Beispiel
Hier ist ein Beispiel, um zu demonstrieren, wie die JSON_QUERY()
Funktion funktioniert:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$')
FROM DUAL;
Ergebnis:
{"a":1,"b":2,"c":3}
Die alleinige Verwendung des Dollarzeichens gibt die gesamte Zeichenfolge der JSON-Daten zurück.
Mit Wrapper
Sie können den WITH WRAPPER
verwenden -Klausel, um das Ergebnis in einen Array-Wrapper einzuschließen:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH WRAPPER)
FROM DUAL;
Ergebnis:
[{"a":1,"b":2,"c":3}]
Sie müssen diese Klausel angeben, wenn der Pfadausdruck mit einem einzelnen Skalarwert (einem Wert, der kein JSON-Objekt oder JSON-Array ist) oder mehreren Werten eines beliebigen Typs übereinstimmt.
Beispielsweise muss die Rückgabe des folgenden Skalarwerts mit dem WITH WRAPPER
erfolgen Klausel:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH WRAPPER)
FROM DUAL;
Ergebnis:
[2]
Weglassen des WITH WRAPPER
-Klausel führt bei der Rückgabe eines Skalarwerts dazu, dass ein Nullwert zurückgegeben wird:
SET NULL 'null';
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$.b')
FROM DUAL;
Ergebnis:
null
Standardmäßig geben SQLcl und SQL*Plus ein Leerzeichen zurück, wenn null
tritt als Ergebnis eines SQL SELECT
auf Erklärung.
Sie können jedoch SET NULL
verwenden um eine andere Zeichenfolge anzugeben, die zurückgegeben werden soll. Hier habe ich angegeben, dass der String null
zurückgegeben werden soll.
Mit bedingtem Wrapper
Alternativ können Sie den WITH CONDITIONAL WRAPPER
verwenden -Klausel, um den Array-Wrapper nur einzuschließen, wenn der Pfadausdruck mit einem einzelnen Skalarwert oder mehreren Werten eines beliebigen Typs übereinstimmt. Wenn der Pfadausdruck mit einem einzelnen JSON-Objekt oder JSON-Array übereinstimmt, wird der Array-Wrapper weggelassen:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH CONDITIONAL WRAPPER) AS "r1",
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH CONDITIONAL WRAPPER) AS "r2"
FROM DUAL;
Ergebnis:
r1 r2 ______________________ ______ {"a":1,"b":2,"c":3} [2]
In diesem Fall wird der Array-Wrapper nur auf den Skalarwert angewendet.
Nur um das klarzustellen, hier ist es mit einem bedingungslosen Wrapper:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH UNCONDITIONAL WRAPPER) AS "r1",
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH UNCONDITIONAL WRAPPER) AS "r2"
FROM DUAL;
Ergebnis:
r1 r2 ________________________ ______ [{"a":1,"b":2,"c":3}] [2]
Dieses Mal wurde der Wrapper auf beide Ergebnisse angewendet.
Beachten Sie, dass WITH UNCONDITIONAL WRAPPER
ist das Äquivalent zu WITH WRAPPER
.
Fehlerbehandlung
Es gibt fünf Klauseln, mit denen Sie angeben können, was zurückgegeben werden soll, wenn bestimmte Arten von Fehlern auftreten. Die Klauseln sind:
NULL
ON
ERROR
– Gibt null zurück, wenn ein Fehler auftritt. Dies ist die Voreinstellung.ERROR
ON
ERROR
– Gibt den entsprechenden Oracle-Fehler zurück, wenn ein Fehler auftritt.EMPTY
ON
ERROR
– Die Angabe dieser Klausel entspricht der Angabe vonEMPTY
ARRAY
ON
ERROR
.EMPTY
ARRAY
ON
ERROR
– Gibt ein leeres JSON-Array zurück ([]
), wenn ein Fehler auftritt.EMPTY
OBJECT
ON
ERROR
– Gibt ein leeres JSON-Objekt zurück ({}
), wenn ein Fehler auftritt.
Hier ist ein Beispiel:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' NULL ON ERROR) AS "r1",
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY ON ERROR) AS "r2",
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY OBJECT ON ERROR) AS "r3"
FROM DUAL;
Ergebnis:
r1 r2 r3 _______ _____ _____ null [] {}
Hier ist es mit dem ERROR ON ERROR
Klausel:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' ERROR ON ERROR)
FROM DUAL;
Ergebnis:
Error report - ORA-40462: JSON_VALUE evaluated to no value
Diese Fehlerklauseln dienen zur Behandlung der folgenden Fehler:
- Das erste Argument sind keine wohlgeformten JSON-Daten mit strenger oder laxer JSON-Syntax
- Es wird keine Übereinstimmung gefunden, wenn die JSON-Daten mit dem SQL/JSON-Pfadausdruck ausgewertet werden. Sie können das Verhalten für diesen Fehlertyp überschreiben, indem Sie die
JSON_query_on_empty_clause
angeben . - Der Datentyp des Rückgabewerts ist nicht groß genug, um die Rückgabezeichenfolge aufzunehmen
- Die Funktion stimmt mit einem einzelnen Skalarwert oder mehreren Werten eines beliebigen Typs überein, und es wurde keine Wrapper-Klausel angegeben
Umgang mit leeren Ergebnissen
Sie können auch eine Klausel verwenden, um den zurückgegebenen Wert anzugeben, wenn keine Übereinstimmung gefunden wird. Mit dieser Klausel können Sie für diesen Fehlertyp ein anderes Ergebnis angeben als das mit den Fehlerklauseln angegebene Ergebnis.
Diese Klauseln sind:
NULL
ON
EMPTY
– Gibt null zurück, wenn keine Übereinstimmung gefunden wird.ERROR
ON
EMPTY
– Gibt den entsprechenden Oracle-Fehler zurück, wenn keine Übereinstimmung gefunden wird.EMPTY
ON
EMPTY
– Die Angabe dieser Klausel entspricht der Angabe vonEMPTY
ARRAY
ON
EMPTY
.EMPTY
ARRAY
ON
EMPTY
– Gibt ein leeres JSON-Array zurück ([]
), wenn keine Übereinstimmung gefunden wird.EMPTY
OBJECT
ON
EMPTY
– Gibt ein leeres JSON-Objekt zurück ({}
), wenn keine Übereinstimmung gefunden wird.
Beispiel:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY ON EMPTY)
FROM DUAL;
Ergebnis:
[]
Wenn Sie diese Klausel weglassen, bestimmt die Fehlerklausel den zurückgegebenen Wert, wenn keine Übereinstimmung gefunden wird.