Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come rinominare una chiave JSON in SQL Server (T-SQL)

Se hai utilizzato JSON_MODIFY() funzione per modificare i documenti JSON in SQL Server, potresti essere abituato a modificare il valore parte di una chiave/valore proprietà. Ma lo sapevi che puoi anche modificare la chiave parte?

Il trucco per farlo è copiare il valore in una nuova chiave, quindi eliminare la vecchia chiave.

Esempi sotto.

Esempio di base

Ecco un esempio di base per mostrare cosa intendo.

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

Risultato:

{"Name":"Homer"}
{"Handle":"Homer"} 

Questo stampa la coppia chiave/valore originale, seguita dalla nuova coppia chiave/valore.

Sebbene possiamo dire di aver "rinominato" la chiave, in realtà abbiamo semplicemente creato una nuova chiave, copiato il valore esistente su quella nuova chiave, quindi eliminato la vecchia chiave impostandola su NULL .

In questo caso, abbiamo utilizzato JSON_VALUE() funzione per estrarre il valore.

Valori numerici

È necessario prestare attenzione quando si copiano i dati nella nuova chiave. Per impostazione predefinita, SQL Server lo racchiude tra virgolette. Questo potrebbe essere o non essere quello che vuoi.

Tuttavia, se stai copiando un valore numerico, è probabile che tu voglia che rimanga un valore numerico (cioè senza virgolette). In questo caso dovrai usare CAST() funzione per eseguirne il cast come tipo di dati numerico. Ecco un esempio:

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

Risultato:

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

Quindi il valore risultante è un numero.

Se rimuoviamo il CAST() funzione da quell'esempio, finiamo con questo:

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

Risultato:

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

Quindi, in questo caso, non abbiamo solo rinominato la chiave, ma abbiamo anche cambiato il tipo di dati (JSON) da un numero a una stringa.

Nota che JSON non distingue tra diversi tipi numerici. Ha un solo tipo numerico:numero.

Chiavi con spazi

In questo esempio, rinomino una chiave esistente con una nuova chiave che contiene uno spazio (è composta da due parole, separate da uno spazio).

Poiché la nuova chiave contiene uno spazio, è necessario racchiudere la chiave tra virgolette. Se non lo faccio, si verificherà un errore.

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

Risultato:

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

Proprietà nidificate

Se la proprietà è nidificata, nessun problema. Usa semplicemente la notazione punto per fare riferimento.

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

Risultato:

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

Potresti anche aver notato che questo esempio utilizza JSON_QUERY() funzione per estrarre il valore, invece di JSON_VALUE() come negli esempi precedenti.

Questo perché in questo caso stiamo estraendo un array e JSON_VALUE() non può estrarre un intero array (può solo estrarre un valore scalare dall'array). Il JSON_QUERY() la funzione, d'altra parte, estrae oggetti e array, ma non valori scalari.

Per saperne di più, consulta JSON_QUERY() rispetto a JSON_VALUE() :Qual è la differenza?