Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

JSON_QUERY() Exemples dans SQL Server (T-SQL)

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 ] ) 

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_Documents

Ré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ée Json_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 le JSON_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 (qui JSON_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 ou strict .

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.