Jeśli używasz JSON_MODIFY() funkcja do modyfikacji dokumentów JSON w SQL Server, możesz być używany do modyfikowania wartości część klucza/wartości własność. Ale czy wiesz, że możesz także zmodyfikować klucz? część?
Sztuką w tym celu jest skopiowanie wartości do nowego klucza, a następnie usunięcie starego klucza.
Przykłady poniżej.
Przykład podstawowy
Oto podstawowy przykład, aby pokazać, o co mi chodzi.
-- 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
Wynik:
{"Name":"Homer"}
{"Handle":"Homer"}
Spowoduje to wydrukowanie oryginalnej pary klucz/wartość, a następnie nowej pary klucz/wartość.
Chociaż możemy powiedzieć, że „zmieniliśmy nazwę” klucza, w rzeczywistości właśnie utworzyliśmy nowy klucz, skopiowaliśmy istniejącą wartość do tego nowego klucza, a następnie usunęliśmy stary klucz, ustawiając go na NULL .
W tym przypadku użyliśmy JSON_VALUE() funkcja wyodrębniania wartości.
Wartości liczbowe
Musisz być ostrożny podczas kopiowania danych do nowego klucza. Domyślnie SQL Server ujmuje go w podwójne cudzysłowy. To może, ale nie musi być to, czego chcesz.
Jeśli jednak kopiujesz wartość liczbową, prawdopodobnie chcesz, aby pozostała wartością liczbową (tj. bez podwójnych cudzysłowów). W takim przypadku będziesz musiał użyć CAST() funkcji rzutowania go jako liczbowego typu danych. Oto przykład:
-- 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
Wynik:
{"Residents":768}
{"Population":768}
Tak więc wynikowa wartość jest liczbą.
Jeśli usuniemy CAST() funkcji z tego przykładu, otrzymujemy to:
-- 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
Wynik:
{"Residents": 768}
{"Population":"768"}
W tym przypadku nie tylko zmieniliśmy nazwę klucza, ale także zmieniliśmy typ danych (JSON) z liczby na ciąg.
Zauważ, że JSON nie rozróżnia różnych typów liczbowych. Ma tylko jeden typ liczbowy:numer.
Klawisze ze spacjami
W tym przykładzie zmieniam nazwę istniejącego klucza na nowy klucz, który zawiera spację (składa się z dwóch słów oddzielonych spacją).
Ponieważ nowy klucz zawiera spację, muszę go otoczyć podwójnymi cudzysłowami. Jeśli tego nie zrobię, wystąpi błąd.
-- 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
Wynik:
{"Population":68}
{"Average IQ":68}
Właściwości zagnieżdżone
Jeśli właściwość jest zagnieżdżona, nie ma problemu. Po prostu użyj notacji kropkowej, aby się do niej odnieść.
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
Wynik:
{
"Suspect": {
"Name": "Homer Simpson",
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}
{
"Suspect": {
"Name": "Homer Simpson"
,"Qualifications":["Eating", "Sleeping", "Base Jumping"]}
}
Być może zauważyłeś również, że w tym przykładzie użyto JSON_QUERY() funkcja wyodrębniania wartości, zamiast JSON_VALUE() jak w poprzednich przykładach.
Dzieje się tak, ponieważ w tym przypadku wyodrębniamy tablicę i JSON_VALUE() nie może wyodrębnić całej tablicy (może tylko wyodrębnić wartość skalarną z tablicy). JSON_QUERY() z drugiej strony funkcja wyodrębnia obiekty i tablice, ale nie wartości skalarne.
Aby dowiedzieć się więcej na ten temat, zobacz JSON_QUERY() w porównaniu z JSON_VALUE() :Jaka jest różnica?