sql >> Database >  >> RDS >> Sqlserver

De naam van een JSON-sleutel in SQL Server (T-SQL) wijzigen

Als je de JSON_MODIFY() . hebt gebruikt functie om JSON-documenten in SQL Server te wijzigen, bent u misschien gewend om de waarde . te wijzigen onderdeel van een sleutel/waarde eigendom. Maar wist u dat u ook de sleutel . kunt wijzigen deel?

De truc om dit te doen, is door de waarde naar een nieuwe sleutel te kopiëren en vervolgens de oude sleutel te verwijderen.

Voorbeelden hieronder.

Basisvoorbeeld

Hier is een eenvoudig voorbeeld om te laten zien wat ik bedoel.

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

Resultaat:

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

Hiermee wordt het oorspronkelijke sleutel/waarde-paar afgedrukt, gevolgd door het nieuwe sleutel/waarde-paar.

Hoewel we kunnen zeggen dat we de sleutel hebben "hernoemd", hebben we eigenlijk gewoon een nieuwe sleutel gemaakt, de bestaande waarde naar die nieuwe sleutel gekopieerd en vervolgens de oude sleutel verwijderd door deze in te stellen op NULL .

In dit geval gebruikten we de JSON_VALUE() functie om de waarde te extraheren.

Numerieke waarden

U moet voorzichtig zijn bij het kopiëren van de gegevens naar de nieuwe sleutel. Standaard zal SQL Server het tussen dubbele aanhalingstekens plaatsen. Dit kan wel of niet zijn wat je wilt.

Als u echter een numerieke waarde kopieert, is de kans groot dat u wilt dat het een numerieke waarde blijft (d.w.z. zonder dubbele aanhalingstekens). In dit geval moet u de CAST() . gebruiken functie om het als een numeriek gegevenstype te casten. Hier is een voorbeeld:

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

Resultaat:

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

De resulterende waarde is dus een getal.

Als we de CAST() . verwijderen functie uit dat voorbeeld, eindigen we met dit:

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

Resultaat:

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

In dit geval hebben we dus niet alleen de sleutel hernoemd, maar ook het (JSON) datatype veranderd van een getal in een string.

Merk op dat JSON geen onderscheid maakt tussen verschillende numerieke typen. Het heeft maar één numeriek type:nummer.

Toetsen met spaties

In dit voorbeeld hernoem ik een bestaande sleutel naar een nieuwe sleutel die een spatie bevat (deze bestaat uit twee woorden, gescheiden door een spatie).

Omdat de nieuwe sleutel een spatie bevat, moet ik de sleutel tussen dubbele aanhalingstekens plaatsen. Als ik dit niet doe, zal er een fout optreden.

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

Resultaat:

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

Geneste eigenschappen

Als de eigenschap genest is, geen probleem. Gebruik gewoon puntnotatie om ernaar te verwijzen.

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

Resultaat:

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

Het is je misschien ook opgevallen dat dit voorbeeld de JSON_QUERY() . gebruikt functie om de waarde te extraheren, in plaats van JSON_VALUE() zoals in de vorige voorbeelden.

Dit komt omdat we in dit geval een array extraheren en JSON_VALUE() kan geen hele array extraheren (het kan alleen een scalaire waarde uit de array extraheren). De JSON_QUERY() functie, aan de andere kant, extraheert objecten en arrays, maar geen scalaire waarden.

Om hier meer over te lezen, zie JSON_QUERY() vs JSON_VALUE() :Wat is het verschil?


  1. Prestaties van SUBSTR op CLOB

  2. Hoe maak en gebruik je een tijdelijke tabel in de Oracle-opgeslagen procedure?

  3. Tijdzoneconversie in SQL-query

  4. Back-up van PostgreSQL met pg_dump en pg_dumpall