sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man returnerar dubblettnycklar från ett JSON-dokument i SQL Server

Om du försöker extrahera värden från ett JSON-dokument, men ett eller flera av värdena på samma nivå har dubbletter av nycklar, kan du stöta på problem om du försöker extrahera dessa värden med JSON_QUERY() eller JSON_VALUE() .

Båda dessa funktioner returnerar bara det första värdet som matchar sökvägen.

Lyckligtvis finns det ett annat alternativ.

OPENJSON() funktionen returnerar alla värden från alla dubbletter av nycklar på samma nivå.

Exempel

Här är ett exempel för att demonstrera OPENJSON() returnerar dubblettegenskaper på samma nivå.

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

Resultat:

+-------+----------+--------+| nyckel   | värde    | skriv   ||-------+----------+--------|| namn  | Hämta    | 1      || namn  | Bra hund | 1      || sex   | manlig     | 1      |+-------+----------+--------+

Det här exemplet returnerar alla underordnade $.dog.details nyckel.

I det här fallet har vi två nycklar med samma namn på samma nivå (name nyckel).

Om vi ​​ville returnera bara värdena från de två name nycklar, kan vi göra något i stil med följande.

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

Resultat:

+----------+| värde    ||--------|| Hämta    || Bra hund |+----------+

JSON_VALUE() &JSON_QUERY()

Som nämnts, både JSON_VALUE() och JSON_QUERY() returnera endast det första värdet som matchar sökvägen.

Så om vi försöker använda dem mot ovanstående JSON-dokument får vi följande resultat.

JSON_VALUE()

JSON_VALUE() returnerar ett skalärt värde från en JSON-sträng, så det kommer att returnera följande resultat.

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

Resultat:

+--------------+| JSON_VALUE   ||-------------|| Hämta        |+--------------+

JSON_QUERY()

JSON_QUERY() extraherar ett objekt eller en array från en JSON-sträng, så att den returnerar följande resultat.

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

Resultat:

+--------------+| JSON_QUERY   ||-------------|| {                "name" :"Hämta",                 "name" :"Bra hund",                "sex" :"hane"            }      -    }      - - - - -  

Åtminstone med JSON_QUERY() vi får se dubblettnycklarna, men vi får inte deras individuella värden som vi får med OPENJSON() .


  1. Autoinkrement i oracle till redan skapad tabell

  2. STÄLL IN SQLBLANKLINES:Hur man tillåter tomma rader i SQLcl &SQL*Plus

  3. Kontrollera Constraint i SQL

  4. Hur kan jag använda regex för att dela en sträng med en sträng som avgränsare?