sql >> Base de Datos >  >> RDS >> Sqlserver

JSON_MODIFY() Ejemplos en SQL Server (T-SQL)

En SQL Server, puede usar T-SQL JSON_MODIFY() función para modificar el valor de una propiedad en una cadena JSON. La función devuelve la cadena JSON actualizada.

Sintaxis

La sintaxis es así:

JSON_MODIFY ( expression , path , newValue )

Donde expression es la expresión de cadena JSON, path es la ruta a la propiedad que desea actualizar y newValue es el nuevo valor que se aplicará a esa propiedad.

Ejemplo  1:uso básico

Aquí hay un ejemplo para demostrarlo.

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

Resultado:

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

En este ejemplo:

  • {"Name": "Homer"} es la cadena JSON original
  • $.Name es la ruta (esta comienza con $. seguido de la ruta a la propiedad que queremos actualizar).
  • Bart es el nuevo valor que queremos asignar a Name (es decir, para reemplazar el valor actual)

Ejemplo 2:devolver el JSON original y modificado

Tenga en cuenta que JSON_MODIFY() no modifica el JSON original. Toma una copia, luego la modifica y la devuelve.

Aquí hay un ejemplo para demostrar esto:

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

Resultado:

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

Ejemplo 3:propiedades anidadas

La ruta puede usar notación de puntos para hacer referencia a propiedades anidadas. He aquí un ejemplo.

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

Resultado:

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

Entonces podemos ver que la ciudad ha sido cambiada de Dunedin a Timaru .

Ejemplo 4:actualizar valores en una matriz

También puede actualizar valores dentro de una matriz. En este ejemplo, actualizamos un valor en Hobbies matriz.

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

Resultado:

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

Dado que las matrices usan numeración basada en cero, actualizamos el tercer elemento haciendo referencia a Hobbies[2] .

Ejemplo 5:agregar un valor a una matriz

En este ejemplo, agregamos un valor a Hobbies formación. Hacemos esto agregando append al comienzo del argumento de la ruta.

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

Resultado:

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

Ejemplo 6:actualizar una matriz completa

En este ejemplo, actualizo toda la matriz.

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

Resultado:

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

Tenga en cuenta que en este ejemplo, el tercer argumento se pasa a JSON_QUERY() función. Si no hubiera hecho esto, SQL Server habría evitado las comillas dobles y los corchetes usando la barra invertida (\ ) carácter (y por lo tanto desordenando la matriz). Habría hecho esto porque no habría sabido si el valor actualizado era una matriz real o una cadena literal.

Entonces, para evitar esto, podemos usar JSON_QUERY() . Esta función devuelve un JSON válido y SQL Server asumirá que el nuevo valor es una matriz.

Esto es lo que hubiera pasado si no hubiéramos usó 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';

Resultado:

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

Por lo tanto, SQL Server se ha escapado de los corchetes y las comillas dobles.

Ejemplo 7:actualizar un objeto completo

Este es un ejemplo de cómo actualizar un objeto completo.

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

Resultado:

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

Nuevamente, si no hubiéramos usado JSON_QUERY() , habríamos recibido una cadena escapada:

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

Resultado:

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

Ejemplo 8:cambiar el nombre de una clave

No solo está limitado a actualizar el valor de una propiedad, también puede cambiar el nombre de su clave. He aquí un ejemplo.

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

Resultado:

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

Aquí, tomamos el valor de la propiedad existente y lo asignamos a un nuevo par clave/valor. Luego establecemos el valor de la clave original en NULL (que lo elimina automáticamente).

Para obtener más ejemplos de cómo cambiar el nombre de una clave, consulte Cómo cambiar el nombre de una clave JSON en SQL Server.