Wenn Sie JSON mit SQL Server verwenden, können Sie JSON_VALUE()
verwenden Funktion, um einen Skalarwert aus einer JSON-Zeichenfolge zurückzugeben.
Um diese Funktion zu verwenden, geben Sie zwei Argumente an; den JSON-Ausdruck und die zu extrahierende Eigenschaft.
Syntax
Die Syntax lautet wie folgt:
JSON_VALUE ( expression , path )
Wobei expression
ist der JSON-String-Ausdruck und path
ist die Eigenschaft, die Sie aus diesem Ausdruck extrahieren möchten.
Das Pfadargument kann einen optionalen Pfadmodus enthalten Komponente. Dieser optionale Pfadmodus kann ein Wert von entweder lax
sein oder strict
. Dieser Wert steht, falls vorhanden, vor dem Dollarzeichen.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein Beispiel, um die grundlegende Verwendung von JSON_VALUE()
zu demonstrieren Funktion.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Ergebnis:
+----------+ | Result | |----------| | Bruce | +----------+
In diesem Beispiel:
- Der
{"Name": "Bruce"}
Argument ist der JSON-Ausdruck (ein kleiner, aber immer noch gültiger JSON-Ausdruck). JSON-Ausdrücke bestehen aus einem Schlüssel/Wert-Paar. In diesem FallName
ist der Schlüssel,Bruce
ist sein Wert. - Der
$.Name
Argument ist der Weg. Dieser Pfad verweist auf den Wert vonName
Schlüssel des JSON-Ausdrucks. Wir können also den Wert extrahieren, indem wir auf den Namen des Paares verweisen.
Beispiel 2 – Arrays
Um einen Wert aus einem Array zu extrahieren, referenzieren Sie seinen Index in eckigen Klammern, gefolgt von dem relevanten Schlüssel. Hier ist ein Beispiel:
/* CREATE THE ARRAY (and put into a variable called @data) */ DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' /* QUERY THE ARRAY */ SELECT JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name', JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(@data,'$.Cities[0].District') AS 'District', JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population' UNION ALL SELECT JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name', JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(@data,'$.Cities[1].District') AS 'District', JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';
Ergebnis:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
In diesem Beispiel erstellen wir also ein JSON-Array und fügen es in eine Variable namens @data
ein . Dann führen wir eine Abfrage mit @data
aus als erstes Argument von JSON_VALUE()
Funktion (das liegt daran, dass @data
enthält den JSON-Ausdruck).
Arrays verwenden eine nullbasierte Nummerierung, um also das erste Element zu extrahieren, müssen wir Cities[0]
verwenden , die zweite Cities[1]
, und so weiter.
Beispiel 3 – Ein Datenbankbeispiel
Wenn wir die Daten aus dem vorherigen Beispiel in eine Datenbank einfügen würden, könnten wir die Abfrage wie folgt umschreiben:
SELECT JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[0].District') AS 'District', JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population' FROM Json_Documents UNION ALL SELECT JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[1].District') AS 'District', JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population' FROM Json_Documents
Ergebnis:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Dies setzt voraus, dass das JSON-Dokument in einer Spalte namens Document
gespeichert ist , die sich in einer Tabelle namens Json_Documents
befindet .
Beispiel 4 – Pfadmodus
Wie erwähnt, haben Sie auch die Möglichkeit, den Pfadmodus festzulegen. Dies kann entweder lax
sein oder strict
.
Der Wert des Pfadmodus bestimmt, was passiert, wenn der Pfadausdruck einen Fehler enthält. Konkret:
- In locker Modus gibt die Funktion leere Werte zurück, wenn der Pfadausdruck einen Fehler enthält. Wenn Sie beispielsweise den Wert $.name anfordern , und der JSON-Text enthält keinen Namen -Taste, gibt die Funktion null zurück, löst aber keinen Fehler aus.
-
In streng -Modus, löst die Funktion einen Fehler aus, wenn der Pfadausdruck einen Fehler enthält.
Der Standardwert ist lax
.
Hier ist ein Beispiel, um den Unterschied zwischen diesen beiden Modi zu demonstrieren.
Fehler im Lax-Modus
Folgendes passiert, wenn der Pfadausdruck im Lax-Modus einen Fehler enthält.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Ergebnis:
+----------+ | Result | |----------| | NULL | +----------+
In diesem Beispiel versuchen wir, auf Hobbies
zu verweisen , aber dieser Schlüssel ist im JSON-Dokument nicht vorhanden. In diesem Fall erhalten wir einen Nullwert (weil wir den Lax-Modus verwenden).
Fehler im strikten Modus
Folgendes passiert, wenn wir denselben Code im strikten Modus ausführen.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
Ergebnis:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
Wie erwartet führt der strikte Modus zur Anzeige einer Fehlermeldung.
Beispiel 5 – Rückgabe von Objekten und Arrays
Der JSON_VALUE()
Funktion gibt keine Objekte und Arrays zurück. Wenn Sie ein Objekt oder ein Array zurückgeben möchten, verwenden Sie JSON_QUERY()
funktionieren stattdessen. Hier ist ein Beispiel, in dem ich beide Funktionen in einer Abfrage verwende.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Mae Sai", "Province": "Chiang Rai", "Country": "Thailand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Ergebnis:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
In diesem Fall verwende ich JSON_VALUE()
um verschiedene skalare Werte zurückzugeben, und JSON_QUERY()
um ein Array zurückzugeben.
Wenn Sie also ein Objekt oder ein Array (einschließlich des gesamten JSON-Dokuments) zurückgeben müssen, siehe JSON_QUERY()
Beispiele in SQL Server.