Lorsque vous utilisez JSON avec SQL Server, vous pouvez utiliser le JSON_QUERY()
fonction pour extraire un objet ou un tableau d'une chaîne JSON.
Pour utiliser cette fonction, vous fournissez l'expression JSON comme argument. Vous pouvez également fournir un deuxième argument (facultatif) pour spécifier l'objet ou le tableau à extraire.
Syntaxe
La syntaxe ressemble à ceci :
JSON_QUERY ( expression [ , chemin ] )
Où expression
est l'expression de chaîne JSON et path
est l'objet ou le tableau que vous souhaitez extraire de cette expression. Le path
l'argument est facultatif (si vous ne le fournissez pas, l'intégralité du document JSON est renvoyé).
L'argument chemin (s'il est fourni) peut inclure un mode chemin facultatif composant. Ce mode de chemin optionnel peut être une valeur soit lax
ou strict
. Cette valeur détermine ce qui se passe si le chemin fourni n'est pas valide. Le mode de chemin (si fourni) vient avant le signe dollar.
Exemple 1 - Utilisation de base
Voici un exemple pour démontrer l'utilisation de base de JSON_QUERY()
fonction.
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Kaboul", "CountryCode":"AFG", "District":"Kabol", "Population" :1780000 }, { "Name":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[0 ]') AS 'Résultat';
Résultat :
+----------+| Résultat ||----------|| { "Name":"Kaboul", "CountryCode":"AFG", "District":"Kabol", "Population":1780000 } |+----------+
Dans cet exemple, je déclare et définit d'abord une variable appelée @data
. J'attribue ensuite un tableau à cette variable. Une fois que j'ai fait cela, j'exécute une requête sur ce tableau.
Dans ce cas, j'utilise Cities[0]
pour référencer le premier élément du tableau (les tableaux JSON utilisent une numérotation de base zéro).
J'ai pu accéder au deuxième élément en utilisant Cities[1]
. Comme ceci :
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Kaboul", "CountryCode":"AFG", "District":"Kabol", "Population" :1780000 }, { "Name":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[1 ]') AS 'Résultat';
Résultat :
+----------+| Résultat ||----------|| { "Name":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } |+----------+
Exemple 2 - Renvoie l'expression JSON complète
Le deuxième argument est facultatif, donc si vous l'omettez, le document JSON entier est renvoyé. Voici ce qui se passe lorsque nous le faisons en utilisant les mêmes données des exemples précédents :
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Kaboul", "CountryCode":"AFG", "District":"Kabol", "Population" :1780000 }, { "Name":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data) AS 'Result';Résultat :
+----------+| Résultat ||----------|| { "Cities":[ { "Name":"Kaboul", "CountryCode":"AFG", "District":"Kabol", "Population":1780000 }, { "Name":"Qandahar", "CountryCode" :"AFG", "District":"Qandahar", "Population":237500 } ]} |+----------+Exemple 3 - Un exemple de base de données
Si nous devions mettre les données de l'exemple précédent dans une base de données, nous pourrions réécrire la requête comme suit :
SELECT JSON_QUERY(Document,'$.Cities[0]') AS 'Ville 1'FROM Json_DocumentsRésultat :
+----------+| Ville 1 ||----------|| { "ID":1, "Name":"Kaboul", "CountryCode":"AFG", "District":"Kabol", "Population":1780000 } |+----------+Cela suppose que le document JSON est stocké dans une colonne appelée
Document
, qui se trouve dans une table appeléeJson_Documents
.Exemple 4 - Valeurs scalaires
Le
JSON_QUERY()
La fonction n'est pas conçue pour renvoyer des valeurs scalaires. Si vous souhaitez renvoyer une valeur scalaire, utilisez leJSON_VALUE()
fonction à la place.Cependant, rien ne vous empêche de combiner les deux fonctions dans une requête pour renvoyer des données à différents niveaux de granularité.
Voici un exemple :
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Suspect":{ "Name":"Homer Simpson", "Hobbies":["Manger", "Dormir", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Loisirs') AS 'Loisirs', JSON_VALUE(@data,'$.Suspect.Loisirs [2]') AS 'Dernier passe-temps' ;Résultat :
+---------------+------------------------------ ----------+--------------+| Nom | Loisirs | Dernier passe-temps ||---------------+------------------------------ ----------+-------------|| Homer Simpson | ["Manger", "Dormir", "Base Jumping"] | Base Jump |+---------------+------------------------------ ----------+--------------+Dans cet exemple, j'ai utilisé
JSON_VALUE()
pour extraire diverses valeurs scalaires, mais j'ai aussi utiliséJSON_QUERY()
pour retourner un tableau entier (quiJSON_VALUE()
ne peux pas faire).Exemple 5 - Mode Chemin
Comme mentionné, vous avez également la possibilité de spécifier le mode de chemin. Cela peut être soit
lax
oustrict
.La valeur du mode de chemin détermine ce qui se passe lorsque l'expression de chemin contient une erreur. Plus précisément :
- En relâchement mode, la fonction renvoie des valeurs vides si l'expression de chemin contient une erreur. Par exemple, si vous demandez la valeur $.name , et le texte JSON ne contient pas de nom key, la fonction renvoie null, mais ne génère pas d'erreur.
-
En strict mode, la fonction génère une erreur si l'expression du chemin contient une erreur.
La valeur par défaut est lax
.
Voici un exemple pour illustrer la différence entre ces deux modes.
Erreur en mode laxiste
Voici ce qui se passe lorsque l'expression de chemin contient une erreur en mode laxiste.
SELECT JSON_QUERY('{"Name":"Bruce"}', 'lax $.Name') AS 'Result' ;
Résultat :
+----------+| Résultat ||----------|| NULL |+----------+
Dans cet exemple, nous essayons de renvoyer une valeur scalaire, mais JSON_QUERY()
ne fait pas de valeurs scalaires. Comme mentionné, il ne renvoie que des objets et des tableaux. Dans ce cas, nous obtenons une valeur nulle (car nous utilisons le mode laxiste).
Erreur en mode strict
Voici ce qui se passe lorsque nous exécutons le même code en mode strict.
SELECT JSON_QUERY('{"Name":"Bruce"}', 'strict $.Name') AS 'Result' ;
Résultat :
Msg 13624, Niveau 16, État 2, Ligne 1L'objet ou le tableau est introuvable dans le chemin JSON spécifié.
Comme prévu, le mode strict génère un message d'erreur expliquant l'erreur.