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

Esempi JSON_MODIFY() in SQL Server (T-SQL)

In SQL Server puoi utilizzare T-SQL JSON_MODIFY() funzione per modificare il valore di una proprietà in una stringa JSON. La funzione restituisce la stringa JSON aggiornata.

Sintassi

La sintassi è questa:

JSON_MODIFY ( expression , path , newValue )

Dove expression è l'espressione della stringa JSON, path è il percorso della proprietà che desideri aggiornare e newValue è il nuovo valore da applicare a quella proprietà.

Esempio 1:utilizzo di base

Ecco un esempio da dimostrare.

SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';

Risultato:

+------------------+
| Result           |
|------------------|
| {"Name": "Bart"} |
+------------------+

In questo esempio:

  • {"Name": "Homer"} è la stringa JSON originale
  • $.Name è il percorso (inizia con $. seguito dal percorso della proprietà che vogliamo aggiornare).
  • Bart è il nuovo valore che vogliamo assegnare a Name (ovvero per sostituire il valore corrente)

Esempio 2:restituire il JSON originale e modificato

Nota che JSON_MODIFY() non modifica il JSON originale. Prende una copia, quindi modifica e restituisce la copia.

Ecco un esempio per dimostrarlo:

DECLARE @suspect NVARCHAR(4000)
SET @suspect= '{"Name": "Homer"}'
SELECT 
  @suspect AS 'Original String',
  JSON_MODIFY(@suspect, '$.Name', 'Bart') AS 'Modified String',
  @suspect AS 'Original String';

Risultato:

+-------------------+-------------------+-------------------+
| Original String   | Modified String   | Original String   |
|-------------------+-------------------+-------------------|
| {"Name": "Homer"} | {"Name": "Bart"}  | {"Name": "Homer"} |
+-------------------+-------------------+-------------------+

Esempio 3 – Proprietà nidificate

Il percorso può utilizzare la notazione a punti per fare riferimento a proprietà nidificate. Ecco un esempio.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect.Address.City', 'Timaru') AS 'Modified Array';

Risultato:

+------------------+
| Modified Array   |
|------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Timaru",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }                  |
+------------------+

Quindi possiamo vedere che la città è stata cambiata da Dunedin a Timaru .

Esempio 4 – Aggiorna valori in un array

Puoi anche aggiornare i valori all'interno di una matrice. In questo esempio, aggiorniamo un valore in Hobbies matrice.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect.Hobbies[2]', 'Brain Surgery') AS 'Updated Hobbies';

Risultato:

+-------------------+
| Updated Hobbies   |
|-------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Brain Surgery"]  
    }
 }                   |
+-------------------+

Poiché gli array utilizzano la numerazione in base zero, aggiorniamo il terzo elemento facendo riferimento a Hobbies[2] .

Esempio 5:aggiungi un valore a un array

In questo esempio, aggiungiamo un valore a Hobbies Vettore. Lo facciamo aggiungendo append all'inizio dell'argomento del percorso.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'append $.Suspect.Hobbies', 'Brain Surgery') AS 'Updated Hobbies';

Risultato:

+-------------------+
| Updated Hobbies   |
|-------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"]  
    }
 }                   |
+-------------------+

Esempio 6:aggiornamento di un intero array

In questo esempio, aggiorno l'intero array.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect.Hobbies', JSON_QUERY('["Chess", "Brain Surgery"]')) AS 'Updated Hobbies';

Risultato:

+-------------------+
| Updated Hobbies   |
|-------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Chess", "Brain Surgery"]  
    }
 }                   |
+-------------------+

Nota che in questo esempio, il terzo argomento viene passato a JSON_QUERY() funzione. Se non l'avessi fatto, SQL Server sarebbe sfuggito alle virgolette doppie e alle parentesi quadre usando la barra rovesciata (\ ) carattere (e quindi incasinando l'array). L'avrebbe fatto perché non avrebbe saputo se il valore aggiornato fosse un array effettivo o una stringa letterale.

Quindi, per aggirare questo problema, possiamo usare JSON_QUERY() . Questa funzione restituisce un JSON valido e SQL Server presumerà quindi che il nuovo valore sia una matrice.

Ecco cosa sarebbe successo se non l'avessimo fatto usato JSON_QUERY() :

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect.Hobbies', '["Chess", "Brain Surgery"]') AS 'Updated Hobbies';

Risultato:

+-------------------+
| Updated Hobbies   |
|-------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": "[\"Chess\", \"Brain Surgery\"]"  
    }
 }                   |
+-------------------+

Quindi SQL Server è sfuggito alle parentesi quadre e alle virgolette doppie.

Esempio 7 – Aggiorna un intero oggetto

Ecco un esempio di aggiornamento di un intero oggetto.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect', JSON_QUERY('{"Name": "Peter Griffin", "Hobbies": "None"}')) AS 'Updated Object';

Risultato:

+------------------+
| Updated Object   |
|------------------|
| {  
    "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"}
 }                  |
+------------------+

Di nuovo, se non avessimo usato JSON_QUERY() , avremmo ricevuto una stringa di escape:

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect', '{"Name": "Peter Griffin", "Hobbies": "None"}') AS 'Updated Object';

Risultato:

+------------------+
| Updated Object   |
|------------------|
| {  
    "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}"
 }                  |
+------------------+

Esempio 8 – Rinominare una chiave

Non sei solo limitato ad aggiornare il valore di una proprietà, puoi anche rinominare la sua chiave. Ecco un esempio.

DECLARE @data NVARCHAR(50)='{"Name":"Homer"}'
PRINT @data

-- Rename the key
SET @data=
 JSON_MODIFY(
  JSON_MODIFY(@data,'$.Handle', JSON_VALUE(@data,'$.Name')),
  '$.Name',
  NULL
 )
PRINT @data

Risultato:

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

Qui, prendiamo il valore dalla proprietà esistente e lo assegniamo a una nuova coppia chiave/valore. Quindi impostiamo il valore della chiave originale su NULL (che lo cancella automaticamente).

Per altri esempi di ridenominazione di una chiave, vedere Come rinominare una chiave JSON in SQL Server.