Se você estiver usando o
JSON_MODIFY()
função para modificar documentos JSON no SQL Server, você pode estar acostumado a modificar o valor parte de uma chave/valor propriedade. Mas você sabia que também pode modificar a chave papel? O truque para fazer isso é copiar o valor para uma nova chave e excluir a chave antiga.
Exemplos abaixo.
Exemplo básico
Aqui está um exemplo básico para mostrar o que quero dizer.
-- 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"}
Isso imprime o par chave/valor original, seguido pelo novo par chave/valor.
Embora possamos dizer que “renomeamos” a chave, na verdade apenas criamos uma nova chave, copiamos o valor existente para essa nova chave e excluímos a chave antiga definindo-a como
NULL
. Neste caso, usamos o
JSON_VALUE()
função para extrair o valor. Valores numéricos
Você precisa ter cuidado ao copiar os dados para a nova chave. Por padrão, o SQL Server o colocará entre aspas duplas. Isso pode ou não ser o que você quer.
No entanto, se você estiver copiando um valor numérico, é provável que você queira que ele permaneça um valor numérico (ou seja, sem aspas duplas). Neste caso, você precisará usar o
CAST()
função para convertê-lo como um tipo de dados numérico. Aqui está um exemplo:-- 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}
Portanto, o valor resultante é um número.
Se removermos o
CAST()
função desse exemplo, acabamos com isso:-- 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"}
Portanto, neste caso, não apenas renomeamos a chave, também alteramos o tipo de dados (JSON) de um número para uma string.
Observe que o JSON não distingue entre diferentes tipos numéricos. Tem apenas um tipo numérico:número.
Teclas com espaços
Neste exemplo, renomeio uma chave existente para uma nova chave que contém um espaço (consiste em duas palavras, separadas por um espaço).
Como a nova chave contém um espaço, preciso colocar a chave entre aspas duplas. Se eu não fizer isso, ocorrerá um erro.
-- 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}
Propriedades aninhadas
Se a propriedade estiver aninhada, não há problema. Basta usar a notação de ponto para referenciá-lo.
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"]} }
Você também deve ter notado que este exemplo usa o
JSON_QUERY()
função para extrair o valor, em vez de JSON_VALUE()
como nos exemplos anteriores. Isso porque neste caso estamos extraindo um array e
JSON_VALUE()
não pode extrair um array inteiro (só pode extrair um valor escalar do array). O JSON_QUERY()
A função, por outro lado, extrai objetos e arrays, mas não valores escalares. Para ler mais sobre isso, consulte
JSON_QUERY()
vs JSON_VALUE()
:Qual é a diferença?