Si vous essayez d'extraire des valeurs d'un document JSON, mais qu'une ou plusieurs des valeurs du même niveau ont des clés en double, vous risquez de rencontrer des problèmes si vous essayez d'extraire ces valeurs à l'aide de JSON_QUERY()
ou JSON_VALUE()
.
Ces deux fonctions ne renverront que la première valeur correspondant au chemin.
Heureusement, il existe une autre option.
Le OPENJSON()
renverra toutes les valeurs de toutes les clés en double au même niveau.
Exemple
Voici un exemple pour démontrer OPENJSON()
renvoyant les propriétés en double au même niveau.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT * FROM OPENJSON(@json, '$.dog.details');
Résultat :
+-------+----------+--------+| clé | valeur | tapez ||-------+----------+--------|| nom | Récupérer | 1 || nom | Bon chien | 1 || sexe | mâle | 1 |+-------+----------+--------+
Cet exemple renvoie tous les enfants de $.dog.details
clé.
Dans ce cas, nous avons deux clés avec le même nom au même niveau (le name
clé).
Si nous voulions renvoyer uniquement les valeurs des deux name
clés, nous pourrions faire quelque chose comme ce qui suit.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name';
Résultat :
+----------+| valeur ||----------|| Récupérer || Bon chien |+----------+
JSON_VALUE()
&JSON_QUERY()
Comme mentionné, les deux JSON_VALUE()
et JSON_QUERY()
ne renvoie que la première valeur qui correspond au chemin.
Donc, si nous essayons de les utiliser par rapport au document JSON ci-dessus, nous obtenons les résultats suivants.
JSON_VALUE()
JSON_VALUE()
renvoie une valeur scalaire à partir d'une chaîne JSON, il renverra donc le résultat suivant.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE];
Résultat :
+--------------+| JSON_VALUE ||--------------|| Récupérer |+--------------+
JSON_QUERY()
JSON_QUERY()
extrait un objet ou un tableau d'une chaîne JSON, il renverra donc le résultat suivant.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY];
Résultat :
+--------------+| JSON_QUERY ||--------------||Au moins avec
JSON_QUERY()
nous arrivons à voir les clés en double, mais nous n'obtenons pas leurs valeurs individuelles comme nous l'obtenons avecOPENJSON()
.