sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan returneres dublerede nøgler fra et JSON-dokument i SQL Server

Hvis du forsøger at udtrække værdier fra et JSON-dokument, men en eller flere af værdierne på samme niveau har dublerede nøgler, kan du løbe ind i problemer, hvis du forsøger at udtrække disse værdier ved hjælp af JSON_QUERY() eller JSON_VALUE() .

Begge disse funktioner vil kun returnere den første værdi, der matcher stien.

Heldigvis er der en anden mulighed.

OPENJSON() funktionen returnerer alle værdier fra alle dubletnøgler på samme niveau.

Eksempel

Her er et eksempel til at demonstrere OPENJSON() returnerer duplikerede egenskaber på samme niveau.

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

Resultat:

+-------+----------+--------+| nøgle   | værdi    | skriv   ||------+----------+--------|| navn  | Hent    | 1      || navn  | God hund | 1      || sex   | mand     | 1      |+-------+-----------+--------+

Dette eksempel returnerer alle børn af $.dog.details nøgle.

I dette tilfælde har vi to nøgler med det samme navn på samme niveau (name nøgle).

Hvis vi ville returnere kun værdierne fra de to name nøgler, kunne vi gøre noget i stil med følgende.

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ærdi    ||--------|| Hent    || God hund |+----------+

JSON_VALUE() &JSON_QUERY()

Som nævnt er både JSON_VALUE() og JSON_QUERY() returner kun den første værdi, der matcher stien.

Så hvis vi forsøger at bruge dem mod ovenstående JSON-dokument, får vi følgende resultater.

JSON_VALUE()

JSON_VALUE() returnerer en skalarværdi fra en JSON-streng, så den returnerer følgende 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   ||-------------|| Hent        |+--------------+

JSON_QUERY()

JSON_QUERY() udtrækker et objekt eller et array fra en JSON-streng, så det returnerer følgende 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   ||-------------|| ( 

I det mindste med JSON_QUERY() vi kommer til at se dubletnøglerne, men vi får ikke deres individuelle værdier, som vi får med OPENJSON() .


  1. PARTITION BY med og uden KEEP i Oracle

  2. Sådan bruges DISTINCT i SQL

  3. Hvordan opretter man en ny database efter den første installation af oracle database 11g Express Edition?

  4. SQL Server tjekke følsomhed mellem store og små bogstaver?