Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

JSON_VALUE()-Beispiele in SQL Server (T-SQL)

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 Fall Name ist der Schlüssel, Bruce ist sein Wert.
  • Der $.Name Argument ist der Weg. Dieser Pfad verweist auf den Wert von Name 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.