sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man byter namn på en JSON-nyckel i SQL Server (T-SQL)

Om du har använt JSON_MODIFY() funktion för att ändra JSON-dokument i SQL Server, kan du vara van vid att ändra värdet del av en nyckel/värde fast egendom. Men visste du att du också kan ändra nyckeln del?

Tricket för att göra detta är att kopiera värdet till en ny nyckel och sedan ta bort den gamla nyckeln.

Exempel nedan.

Grundläggande exempel

Här är ett grundläggande exempel för att visa vad jag menar.

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

Resultat:

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

Detta skriver ut det ursprungliga nyckel/värdeparet, följt av det nya nyckel/värdeparet.

Även om vi kan säga att vi "döpte om" nyckeln, skapade vi faktiskt bara en ny nyckel, kopierade det befintliga värdet till den nya nyckeln och tog sedan bort den gamla nyckeln genom att ställa in den till NULL .

I det här fallet använde vi JSON_VALUE() funktion för att extrahera värdet.

Numeriska värden

Du måste vara försiktig när du kopierar data till den nya nyckeln. Som standard omger SQL Server den med dubbla citattecken. Detta kanske är vad du vill ha eller inte.

Men om du kopierar ett numeriskt värde är chansen stor att du vill att det ska förbli ett numeriskt värde (dvs utan dubbla citattecken). I det här fallet måste du använda CAST() funktion för att casta den som en numerisk datatyp. Här är ett exempel:

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

Resultat:

{"Residents":768}
{"Population":768} 

Så det resulterande värdet är ett tal.

Om vi ​​tar bort CAST() funktionen från det exemplet slutar vi med detta:

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

Resultat:

{"Residents": 768}
{"Population":"768"} 

Så i det här fallet bytte vi inte bara namn på nyckeln, vi ändrade också datatypen (JSON) från ett nummer till en sträng.

Observera att JSON inte skiljer mellan olika numeriska typer. Den har bara en numerisk typ:nummer.

Nycklar med mellanslag

I det här exemplet byter jag namn på en befintlig nyckel till en ny nyckel som innehåller ett mellanslag (den består av två ord, åtskilda av ett mellanslag).

Eftersom den nya nyckeln innehåller ett mellanslag måste jag omge nyckeln med dubbla citattecken. Om jag inte gör detta kommer ett fel att uppstå.

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

Resultat:

{"Population":68}
{"Average IQ":68} 

Inkapslade egenskaper

Om egenskapen är kapslad, inga problem. Använd helt enkelt punktnotation för att referera till det.

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

Resultat:

	{ 
"Suspect": { 
"Name": "Homer Simpson", 
"Hobbies": ["Eating", "Sleeping", "Base Jumping"] 
}
}
{ 
"Suspect": { 
"Name": "Homer Simpson" 
,"Qualifications":["Eating", "Sleeping", "Base Jumping"]}
} 

Du kanske också har märkt att det här exemplet använder JSON_QUERY() funktion för att extrahera värdet, istället för JSON_VALUE() som i de tidigare exemplen.

Detta beror på att vi i det här fallet extraherar en array och JSON_VALUE() kan inte extrahera en hel array (den kan bara extrahera ett skalärt värde från arrayen). JSON_QUERY() funktion, å andra sidan, extraherar objekt och arrayer, men inte skalära värden.

För att läsa mer om detta, se JSON_QUERY() kontra JSON_VALUE() :Vad är skillnaden?


  1. Hur du dokumenterar din SQL Server-databas

  2. order by newid() - hur fungerar det?

  3. PostgreSQL 9.1:Hur man sammanfogar rader i array utan dubbletter, GÅ MED i en annan tabell

  4. ASCII()-exempel – MySQL