Si has estado usando JSON_MODIFY()
función para modificar documentos JSON en SQL Server, es posible que esté acostumbrado a modificar el valor parte de una clave/valor propiedad. Pero, ¿sabías que también puedes modificar la clave parte?
El truco para hacer esto es copiar el valor a una clave nueva y luego eliminar la clave anterior.
Ejemplos a continuación.
Ejemplo básico
Aquí hay un ejemplo básico para mostrar lo que quiero decir.
-- 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
Resultado:
{"Name":"Homer"} {"Handle":"Homer"}
Esto imprime el par clave/valor original, seguido del nuevo par clave/valor.
Aunque podemos decir que "cambiamos el nombre" de la clave, en realidad acabamos de crear una nueva clave, copiamos el valor existente en esa nueva clave y luego eliminamos la clave anterior configurándola en NULL
.
En este caso, usamos el JSON_VALUE()
función para extraer el valor.
Valores numéricos
Debe tener cuidado al copiar los datos en la nueva clave. De forma predeterminada, SQL Server lo encerrará entre comillas dobles. Esto puede o no ser lo que quieres.
Sin embargo, si está copiando un valor numérico, es probable que desee que siga siendo un valor numérico (es decir, sin comillas dobles). En este caso, deberá utilizar CAST()
función para convertirlo como un tipo de datos numérico. He aquí un ejemplo:
-- 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
Resultado:
{"Residents":768} {"Population":768}
Entonces el valor resultante es un número.
Si eliminamos el CAST()
función de ese ejemplo, terminamos con esto:
-- 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
Resultado:
{"Residents": 768} {"Population":"768"}
Entonces, en este caso, no solo cambiamos el nombre de la clave, también cambiamos el tipo de datos (JSON) de un número a una cadena.
Tenga en cuenta que JSON no distingue entre diferentes tipos numéricos. Tiene un solo tipo numérico:número.
Teclas con espacios
En este ejemplo, cambio el nombre de una clave existente a una nueva clave que contiene un espacio (consta de dos palabras, separadas por un espacio).
Debido a que la nueva clave contiene un espacio, necesito encerrar la clave entre comillas dobles. Si no hago esto, se producirá un error.
-- 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
Resultado:
{"Population":68} {"Average IQ":68}
Propiedades anidadas
Si la propiedad está anidada, no hay problema. Simplemente use la notación de puntos para hacer referencia a ella.
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
Resultado:
{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } { "Suspect": { "Name": "Homer Simpson" ,"Qualifications":["Eating", "Sleeping", "Base Jumping"]} }
Es posible que también hayas notado que este ejemplo usa JSON_QUERY()
función para extraer el valor, en lugar de JSON_VALUE()
como en los ejemplos anteriores.
Esto se debe a que en este caso estamos extrayendo una matriz y JSON_VALUE()
no puede extraer una matriz completa (solo puede extraer un valor escalar de la matriz). El JSON_QUERY()
La función, por otro lado, extrae objetos y matrices, pero no valores escalares.
Para leer más sobre esto, vea JSON_QUERY()
frente a JSON_VALUE()
:¿Cuál es la diferencia?