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