sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan omdøbes en JSON-nøgle i SQL Server (T-SQL)

Hvis du har brugt JSON_MODIFY() funktion til at ændre JSON-dokumenter i SQL Server, kan du være vant til at ændre værdien del af en nøgle/værdi ejendom. Men vidste du, at du også kan ændre nøglen del?

Tricket til at gøre dette er at kopiere værdien til en ny nøgle og derefter slette den gamle nøgle.

Eksempler nedenfor.

Grundlæggende eksempel

Her er et grundlæggende eksempel for at vise, hvad jeg mener.

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

Dette udskriver det originale nøgle/værdi-par, efterfulgt af det nye nøgle/værdi-par.

Selvom vi kan sige, at vi "omdøbte" nøglen, har vi faktisk bare oprettet en ny nøgle, kopieret den eksisterende værdi til den nye nøgle og derefter slettet den gamle nøgle ved at sætte den til NULL .

I dette tilfælde brugte vi JSON_VALUE() funktion til at udtrække værdien.

Numeriske værdier

Du skal være forsigtig, når du kopierer dataene til den nye nøgle. Som standard vil SQL Server omslutte det i dobbelte anførselstegn. Dette er måske eller måske ikke det, du ønsker.

Men hvis du kopierer en numerisk værdi, er chancerne for, at du ønsker, at den forbliver en numerisk værdi (dvs. uden dobbelte anførselstegn). I dette tilfælde skal du bruge CAST() funktion til at caste det som en numerisk datatype. Her er et eksempel:

-- 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å den resulterende værdi er et tal.

Hvis vi fjerner CAST() funktion fra det eksempel, ender vi med dette:

-- 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 dette tilfælde omdøbte vi ikke bare nøglen, vi ændrede også (JSON) datatypen fra et tal til en streng.

Bemærk, at JSON ikke skelner mellem forskellige numeriske typer. Den har kun én numerisk type:nummer.

Nøgler med mellemrum

I dette eksempel omdøber jeg en eksisterende nøgle til en ny nøgle, der indeholder et mellemrum (den består af to ord, adskilt af et mellemrum).

Fordi den nye nøgle indeholder et mellemrum, skal jeg omgive nøglen med dobbelte anførselstegn. Hvis jeg ikke gør dette, opstår der en fejl.

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

Indlejrede egenskaber

Hvis egenskaben er indlejret, er der ikke noget problem. Du skal blot bruge prik-notation til at referere til 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 har måske også bemærket, at dette eksempel bruger JSON_QUERY() funktion til at udtrække værdien i stedet for JSON_VALUE() ligesom i de foregående eksempler.

Dette skyldes, at vi i dette tilfælde udtrækker et array og JSON_VALUE() kan ikke udtrække en hel matrix (den kan kun udtrække en skalarværdi fra matrixen). JSON_QUERY() funktion udtrækker på den anden side objekter og arrays, men ikke skalære værdier.

For at læse mere om dette, se JSON_QUERY() vs JSON_VALUE() :Hvad er forskellen?


  1. MySQL SIGN() Funktion – Find ud af, om et tal er positivt eller negativt i MySQL

  2. En begrænsning, der kun tillader en af ​​to tabeller at referere til en basistabel

  3. Sådan opretter du udsigt i oracle

  4. TRIM() Funktion i Oracle