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

So geben Sie doppelte Schlüssel aus einem JSON-Dokument in SQL Server zurück

Wenn Sie versuchen, Werte aus einem JSON-Dokument zu extrahieren, aber einer oder mehrere der Werte auf derselben Ebene doppelte Schlüssel haben, treten möglicherweise Probleme auf, wenn Sie versuchen, diese Werte mit JSON_QUERY() oder JSON_VALUE() .

Beide Funktionen geben nur den ersten Wert zurück, der mit dem Pfad übereinstimmt.

Glücklicherweise gibt es noch eine andere Option.

Der OPENJSON() Die Funktion gibt alle Werte von allen doppelten Schlüsseln auf derselben Ebene zurück.

Beispiel

Hier ist ein Beispiel, um OPENJSON() zu demonstrieren Zurückgeben doppelter Eigenschaften auf derselben Ebene.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT * FROM OPENJSON(@json, '$.dog.details');

Ergebnis:

+-------+----------+--------+
| key   | value    | type   |
|-------+----------+--------|
| name  | Fetch    | 1      |
| name  | Good Dog | 1      |
| sex   | male     | 1      |
+-------+----------+--------+

Dieses Beispiel gibt alle untergeordneten Elemente von $.dog.details zurück Schlüssel.

In diesem Fall haben wir zwei Schlüssel mit demselben Namen auf derselben Ebene (der name Schlüssel).

Wenn wir nur die Werte aus den beiden name zurückgeben wollten Tasten, könnten wir etwa Folgendes tun.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name';

Ergebnis:

+----------+
| value    |
|----------|
| Fetch    |
| Good Dog |
+----------+

JSON_VALUE() &JSON_QUERY()

Wie bereits erwähnt, beides JSON_VALUE() und JSON_QUERY() gibt nur den ersten Wert zurück, der mit dem Pfad übereinstimmt.

Wenn wir also versuchen, diese mit dem obigen JSON-Dokument zu verwenden, erhalten wir die folgenden Ergebnisse.

JSON_VALUE()

JSON_VALUE() gibt einen Skalarwert aus einer JSON-Zeichenfolge zurück, sodass das folgende Ergebnis zurückgegeben wird.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE];

Ergebnis:

+--------------+
| JSON_VALUE   |
|--------------|
| Fetch        |
+--------------+

JSON_QUERY()

JSON_QUERY() extrahiert ein Objekt oder ein Array aus einer JSON-Zeichenfolge, sodass das folgende Ergebnis zurückgegeben wird.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY];

Ergebnis:

+--------------+
| JSON_QUERY   |
|--------------|
| {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }              |
+--------------+

Zumindest mit JSON_QUERY() Wir sehen die doppelten Schlüssel, aber wir bekommen nicht ihre individuellen Werte, wie wir es mit OPENJSON() bekommen .