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

Comment renommer une clé JSON dans SQL Server (T-SQL)

Si vous avez utilisé le JSON_MODIFY() fonction pour modifier les documents JSON dans SQL Server, vous pourriez être habitué à modifier la valeur partie d'une clé/valeur biens. Mais saviez-vous que vous pouvez également modifier la clé partie ?

L'astuce consiste à copier la valeur dans une nouvelle clé, puis à supprimer l'ancienne clé.

Exemples ci-dessous.

Exemple de base

Voici un exemple de base pour montrer 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 imprime la paire clé/valeur d'origine, suivie de la nouvelle paire clé/valeur.

Bien que nous puissions dire que nous avons "renommé" la clé, nous venons en fait de créer une nouvelle clé, de copier la valeur existante dans cette nouvelle clé, puis de supprimer l'ancienne clé en la définissant sur NULL .

Dans ce cas, nous avons utilisé le JSON_VALUE() fonction pour extraire la valeur.

Valeurs numériques

Vous devez être prudent lorsque vous copiez les données sur la nouvelle clé. Par défaut, SQL Server le mettra entre guillemets doubles. Cela peut ou non être ce que vous voulez.

Cependant, si vous copiez une valeur numérique, il est probable que vous souhaitiez qu'elle reste une valeur numérique (c'est-à-dire sans guillemets doubles). Dans ce cas, vous devrez utiliser le CAST() fonction pour le convertir en type de données numérique. 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} 

La valeur résultante est donc un nombre.

Si nous supprimons le CAST() fonction de cet exemple, nous nous retrouvons avec ceci :

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

Résultat :

{"Residents": 768}
{"Population":"768"} 

Donc, dans ce cas, nous n'avons pas simplement renommé la clé, nous avons également modifié le type de données (JSON) d'un nombre à une chaîne.

Notez que JSON ne fait pas de distinction entre les différents types numériques. Il n'a qu'un seul type numérique :nombre.

Touches avec espaces

Dans cet exemple, je renomme une clé existante en une nouvelle clé qui contient un espace (elle se compose de deux mots, séparés par un espace).

Étant donné que la nouvelle clé contient un espace, je dois entourer la clé de guillemets doubles. Si je ne le fais pas, une erreur se produira.

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

Résultat :

{"Population":68}
{"Average IQ":68} 

Propriétés imbriquées

Si la propriété est imbriquée, pas de problème. Utilisez simplement la notation par points pour le référencer.

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

Résultat :

	{ 
"Suspect": { 
"Name": "Homer Simpson", 
"Hobbies": ["Eating", "Sleeping", "Base Jumping"] 
}
}
{ 
"Suspect": { 
"Name": "Homer Simpson" 
,"Qualifications":["Eating", "Sleeping", "Base Jumping"]}
} 

Vous avez peut-être aussi remarqué que cet exemple utilise le JSON_QUERY() fonction pour extraire la valeur, au lieu de JSON_VALUE() comme dans les exemples précédents.

En effet, dans ce cas, nous extrayons un tableau et JSON_VALUE() ne peut pas extraire un tableau entier (il ne peut extraire qu'une valeur scalaire du tableau). Le JSON_QUERY() fonction, d'autre part, extrait des objets et des tableaux, mais pas des valeurs scalaires.

Pour en savoir plus à ce sujet, consultez JSON_QUERY() contre JSON_VALUE()  :Quelle est la différence ?