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

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

Wenn Sie JSON mit SQL Server verwenden, können Sie JSON_QUERY() verwenden Funktion, um ein Objekt oder ein Array aus einer JSON-Zeichenfolge zu extrahieren.

Um diese Funktion zu verwenden, geben Sie den JSON-Ausdruck als Argument an. Sie können auch ein zweites (optionales) Argument angeben, um das zu extrahierende Objekt oder Array anzugeben.

Syntax

Die Syntax sieht so aus:

JSON_QUERY ( expression [ , path ] )  

Wobei expression ist der JSON-String-Ausdruck und path ist das Objekt oder Array, das Sie aus diesem Ausdruck extrahieren möchten. Der path Das Argument ist optional (wenn Sie es nicht angeben, wird das gesamte JSON-Dokument zurückgegeben).

Das Pfadargument (falls angegeben) kann einen optionalen Pfadmodus enthalten Komponente. Dieser optionale Pfadmodus kann ein Wert von entweder lax sein oder strict . Dieser Wert bestimmt, was passiert, wenn der angegebene Pfad ungültig ist. Der Pfadmodus (falls angegeben) steht vor dem Dollarzeichen.

Beispiel 1 – Grundlegende Verwendung

Hier ist ein Beispiel, um die grundlegende Verwendung von JSON_QUERY() zu demonstrieren Funktion.

DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'
SELECT JSON_QUERY(@data, '$.Cities[0]') AS 'Result';

Ergebnis:

+----------+
| Result   |
|----------|
| {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        }          |
+----------+

In diesem Beispiel deklariere und setze ich zuerst eine Variable namens @data . Dieser Variable weise ich dann ein Array zu. Sobald ich dies getan habe, führe ich eine Abfrage für dieses Array aus.

In diesem Fall verwende ich Cities[0] um auf das erste Element im Array zu verweisen (JSON-Arrays verwenden eine nullbasierte Nummerierung).

Auf das zweite Element konnte ich mit Cities[1] zugreifen . So:

DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'
SELECT JSON_QUERY(@data, '$.Cities[1]') AS 'Result';

Ergebnis:

+----------+
| Result   |
|----------|
| {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }          |
+----------+

Beispiel 2 – Den gesamten JSON-Ausdruck zurückgeben

Das zweite Argument ist optional. Wenn Sie es also weglassen, wird das gesamte JSON-Dokument zurückgegeben. Folgendes passiert, wenn wir die gleichen Daten aus den vorherigen Beispielen verwenden:

DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'
SELECT JSON_QUERY(@data) AS 'Result';

Ergebnis:

+----------+
| Result   |
|----------|
| {
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}          |
+----------+

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_QUERY(Document,'$.Cities[0]') AS 'City 1'
FROM Json_Documents

Ergebnis:

+----------+
| City 1   |
|----------|
| {
            "ID": 1,
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        }          |
+----------+

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 – Skalare Werte

Der JSON_QUERY() Die Funktion ist nicht darauf ausgelegt, skalare Werte zurückzugeben. Wenn Sie einen Skalarwert zurückgeben möchten, verwenden Sie JSON_VALUE() stattdessen funktionieren.

Nichts hindert Sie jedoch daran, beide Funktionen in einer Abfrage zu kombinieren, um Daten auf verschiedenen Granularitätsebenen zurückzugeben.

Hier ist ein Beispiel:

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
   JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
   JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';

Ergebnis:

+---------------+----------------------------------------+--------------+
| Name          | Hobbies                                | Last Hobby   |
|---------------+----------------------------------------+--------------|
| Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping |
+---------------+----------------------------------------+--------------+

In diesem Beispiel habe ich JSON_VALUE() verwendet um verschiedene skalare Werte zu extrahieren, aber ich habe auch JSON_QUERY() verwendet um ein ganzes Array zurückzugeben (was JSON_VALUE() kann nicht).

Beispiel 5 – 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_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';

Ergebnis:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

In diesem Beispiel versuchen wir, einen Skalarwert zurückzugeben, aber JSON_QUERY() macht keine skalaren Werte. Wie bereits erwähnt, gibt es nur Objekte und Arrays zurück. 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_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';

Ergebnis:

Msg 13624, Level 16, State 2, Line 1
Object or array cannot be found in the specified JSON path.

Wie erwartet führt der strikte Modus zu einer Fehlermeldung, die den Fehler erklärt.