Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como renomear uma chave JSON no SQL Server (T-SQL)


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?