sql >> Database >  >> RDS >> Sqlserver

Dubbele sleutels retourneren van een JSON-document in SQL Server

Als u waarden uit een JSON-document probeert te extraheren, maar een of meer van de waarden op hetzelfde niveau dubbele sleutels hebben, kunt u problemen tegenkomen als u probeert die waarden te extraheren met JSON_QUERY() of JSON_VALUE() .

Beide functies retourneren alleen de eerste waarde die overeenkomt met het pad.

Gelukkig is er nog een andere optie.

De OPENJSON() functie retourneert alle waarden van dubbele sleutels op hetzelfde niveau.

Voorbeeld

Hier is een voorbeeld om OPENJSON() te demonstreren dubbele eigenschappen op hetzelfde niveau retourneren.

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

Resultaat:

+-------+----------+--------+| sleutel   | waarde    | type   ||-------+----------+--------|| naam  | Ophalen    | 1      || naam  | Goede hond | 1      || seks   | man     | 1      |+-------+----------+--------+

Dit voorbeeld retourneert alle onderliggende items van de $.dog.details sleutel.

In dit geval hebben we twee sleutels met dezelfde naam op hetzelfde niveau (de name toets).

Als we alleen de waarden van de twee name sleutels, kunnen we zoiets als het volgende doen.

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

Resultaat:

+----------+| waarde    ||----------|| Ophalen    || Goede hond |+----------+

JSON_VALUE() &JSON_QUERY()

Zoals gezegd, beide JSON_VALUE() en JSON_QUERY() retourneert alleen de eerste waarde die overeenkomt met het pad.

Dus als we die proberen te gebruiken tegen het bovenstaande JSON-document, krijgen we de volgende resultaten.

JSON_VALUE()

JSON_VALUE() retourneert een scalaire waarde van een JSON-tekenreeks, dus het geeft het volgende resultaat.

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

Resultaat:

+--------------+| JSON_VALUE   ||--------------|| Ophalen        |+--------------+

JSON_QUERY()

JSON_QUERY() extraheert een object of een array uit een JSON-tekenreeks, zodat het volgende resultaat wordt geretourneerd.

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

Resultaat:

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

Tenminste met JSON_QUERY() we krijgen de dubbele sleutels te zien, maar we krijgen niet hun individuele waarden zoals we krijgen met OPENJSON() .


  1. Hoe de functie JulianDay() werkt in SQLite

  2. Manieren om SQL Server te repareren Detecteerde een op logische consistentie gebaseerde I/O-fout

  3. geen pg_hba.conf invoer voor host

  4. PLS-00103:Ontmoet het symbool CREATE