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 medOPENJSON()
.