Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zmienić nazwę klucza JSON w SQL Server (T-SQL)

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć śledzenie SQL w celu przechwytywania zdarzeń serwera SQL

  2. Jak znaleźć element listy w określonej pozycji w SQL Server

  3. Jak uzyskać losowe wiersze z tabeli SQL Server — samouczek SQL Server / TSQL część 117

  4. Jak uzyskać ciąg połączenia z bazy danych

  5. Złożony klucz podstawowy a kolumna dodatkowego identyfikatora?