Si vous avez utilisé la fonction JSON_MODIFY()
pour modifier des documents JSON dans SQL Server, vous êtes peut-être habitué à modifier la partie key/value
de l'attribut value
. Mais saviez-vous que vous pouvez également modifier la partie key
L'astuce pour ce faire est de copier la valeur dans une nouvelle clé, puis de supprimer l'ancienne clé.
Voici un exemple de base de ce que je veux dire.
-- Declare a variable and assign some JSON to it DECLARE @data NVARCHAR(50)='{"Name":"Homer"}' -- Print the current JSON PRINT @data -- Rename the key (by copying the value to a new key, then deleting the old one) SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Handle', JSON_VALUE(@data,'$.Name')), '$.Name', NULL ) -- Print the new JSON PRINT @data
Résultat :
{"Name":"Homer"} {"Handle":"Homer"}
Cela imprimera la paire clé/valeur d'origine, puis la nouvelle paire clé/valeur.
Bien que nous puissions dire que nous avons "renommé" la clé, en réalité, nous venons de créer une nouvelle clé, de copier la valeur existante sur cette nouvelle clé, puis de définir l'ancienne clé sur NULL pour la supprimer.
Dans cet exemple, nous utilisons la fonction JSON_VALUE()
pour extraire la valeur.
Valeurs numériques
Des précautions doivent être prises lors de la copie de données vers une nouvelle clé. Par défaut, SQL Server le met entre guillemets doubles. Cela peut être ou non ce que vous souhaitez.
Cependant, si vous copiez une valeur numérique, vous souhaiterez probablement qu'elle reste une valeur numérique (c'est-à-dire sans guillemets doubles). Dans ce cas, il doit être converti en un type de données numérique à l'aide de la fonction CAST()
. Voici un exemple :
-- Declare a variable and assign some JSON to it DECLARE @data NVARCHAR(50)='{"Residents":768}' -- Print the current JSON PRINT @data -- Rename the key (by copying the value to a new key, then deleting the old one) SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Population', CAST(JSON_VALUE(@data,'$.Residents') AS int)), '$.Residents', NULL ) -- Print the new JSON PRINT @data
Résultat :
{"Residents":768} {"Population":768}
Le résultat est donc un nombre.
Si nous supprimons la fonction CAST()
de cet exemple, nous obtenons le résultat :
-- Declare a variable and assign some JSON to it DECLARE @data NVARCHAR(50)='{"Residents": 768}' -- Print the current JSON PRINT @data -- Rename the key (by copying the value to a new key, then deleting the old one) SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Population', JSON_VALUE(@data,'$.Residents')), '$.Residents', NULL ) -- Print the new JSON PRINT @data
Le résultat : Dans ce cas, nous avons non seulement renommé les clés, mais également modifié les Type de données (JSON) de numérique à chaîne.
{"Residents": 768} {"Population":"768"}
que JSON ne fait pas de distinction entre les différents types de nombres. Il n’a qu’un seul type numérique : le nombre.
clé clé et espace
Dans cet exemple, j'ai renommé une clé existante en une nouvelle clé qui contient des espaces (elle se compose de deux mots séparés par des espaces).
Étant donné que la nouvelle clé contient des espaces, je dois l'entourer de guillemets doubles. Si vous ne le faites pas, des erreurs se produiront.
Résultat :
-- Declare a variable and assign some JSON to it DECLARE @data NVARCHAR(50)='{"Population":68}' -- Print the current JSON PRINT @data -- Rename the key (by copying the value to a new key, then deleting the old one) SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$."Average IQ"', CAST(JSON_VALUE(@data,'$.Population') AS int)), '$.Population', NULL ) -- Print the new JSON PRINT @data
Propriétés imbriquées
{"Population":68} {"Average IQ":68}
Si les propriétés sont imbriquées, alors Pas de problème. Utilisez simplement la notation par points pour y faire référence.
Résultat :
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' PRINT @data SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Suspect.Qualifications', JSON_QUERY(@data,'$.Suspect.Hobbies')), '$.Suspect.Hobbies', NULL ) PRINT @data
Vous remarquerez peut-être également que cet exemple utilise la fonction
pour extraire la valeur, plutôt que l'exemple précédent Utiliser
{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } { "Suspect": { "Name": "Homer Simpson" ,"Qualifications":["Eating", "Sleeping", "Base Jumping"]} }
C'est parce que dans ce cas, nous extrayons un tableau, et JSON_QUERY()
ne peut pas extraire l'intégralité du tableau (il ne peut extraire que les valeurs scalaires du tableau). En revanche, la fonction JSON_VALUE()
extrait les objets et les tableaux, mais pas les valeurs scalaires.
Recommandations associées : "JSON_VALUE()
Tutoriel SQLJSON_QUERY()
" "
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!