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?