Wenn Sie JSON_MODIFY()
verwendet haben Funktion zum Ändern von JSON-Dokumenten in SQL Server verwenden, sind Sie möglicherweise daran gewöhnt, den Wert zu ändern Teil eines Schlüssels/Werts Eigentum. Aber wussten Sie, dass Sie auch den Schlüssel ändern können? Teil?
Der Trick dabei ist, den Wert in einen neuen Schlüssel zu kopieren und dann den alten Schlüssel zu löschen.
Beispiele unten.
Einfaches Beispiel
Hier ist ein einfaches Beispiel, um zu zeigen, was ich meine.
-- 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
Ergebnis:
{"Name":"Homer"} {"Handle":"Homer"}
Dadurch wird das ursprüngliche Schlüssel/Wert-Paar ausgegeben, gefolgt vom neuen Schlüssel/Wert-Paar.
Obwohl wir sagen können, dass wir den Schlüssel „umbenannt“ haben, haben wir tatsächlich nur einen neuen Schlüssel erstellt, den vorhandenen Wert in diesen neuen Schlüssel kopiert und dann den alten Schlüssel gelöscht, indem wir ihn auf NULL
gesetzt haben .
In diesem Fall haben wir den JSON_VALUE()
verwendet Funktion, um den Wert zu extrahieren.
Numerische Werte
Sie müssen vorsichtig sein, wenn Sie die Daten auf den neuen Schlüssel kopieren. Standardmäßig schließt SQL Server es in doppelte Anführungszeichen ein. Dies kann oder kann nicht das sein, was Sie wollen.
Wenn Sie jedoch einen numerischen Wert kopieren, möchten Sie wahrscheinlich, dass er ein numerischer Wert bleibt (d. h. ohne doppelte Anführungszeichen). In diesem Fall müssen Sie CAST()
verwenden -Funktion, um sie in einen numerischen Datentyp umzuwandeln. Hier ist ein Beispiel:
-- 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
Ergebnis:
{"Residents":768} {"Population":768}
Der resultierende Wert ist also eine Zahl.
Wenn wir CAST()
entfernen Funktion aus diesem Beispiel erhalten wir Folgendes:
-- 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
Ergebnis:
{"Residents": 768} {"Population":"768"}
In diesem Fall haben wir also nicht nur den Schlüssel umbenannt, sondern auch den (JSON-)Datentyp von einer Zahl in eine Zeichenfolge geändert.
Beachten Sie, dass JSON nicht zwischen verschiedenen numerischen Typen unterscheidet. Es hat nur einen numerischen Typ:Zahl.
Schlüssel mit Leerzeichen
In diesem Beispiel benenne ich einen vorhandenen Schlüssel in einen neuen Schlüssel um, der ein Leerzeichen enthält (er besteht aus zwei Wörtern, die durch ein Leerzeichen getrennt sind).
Da der neue Schlüssel ein Leerzeichen enthält, muss ich den Schlüssel in doppelte Anführungszeichen setzen. Wenn ich dies nicht tue, tritt ein Fehler auf.
-- 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
Ergebnis:
{"Population":68} {"Average IQ":68}
Verschachtelte Eigenschaften
Wenn die Eigenschaft verschachtelt ist, kein Problem. Verwenden Sie einfach die Punktnotation, um darauf zu verweisen.
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
Ergebnis:
{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } { "Suspect": { "Name": "Homer Simpson" ,"Qualifications":["Eating", "Sleeping", "Base Jumping"]} }
Sie haben vielleicht auch bemerkt, dass dieses Beispiel JSON_QUERY()
verwendet Funktion zum Extrahieren des Werts anstelle von JSON_VALUE()
wie in den vorherigen Beispielen.
Dies liegt daran, dass wir in diesem Fall ein Array und JSON_VALUE()
extrahieren kann kein ganzes Array extrahieren (es kann nur einen Skalarwert aus dem Array extrahieren). Der JSON_QUERY()
Die Funktion hingegen extrahiert Objekte und Arrays, aber keine Skalarwerte.
Weitere Informationen hierzu finden Sie unter JSON_QUERY()
vs JSON_VALUE()
:Was ist der Unterschied?