Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да преименувате JSON ключ в SQL Server (T-SQL)

Ако сте използвали JSON_MODIFY() функция за промяна на JSON документи в SQL Server, може да сте свикнали да променяте стойността част от ключ/стойност Имот. Но знаете ли, че можете също да промените ключа част?

Номерът за това е да копирате стойността в нов ключ, след което да изтриете стария ключ.

Примери по-долу.

Основен пример

Ето един основен пример, за да покажа какво имам предвид.

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

Резултат:

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

Това отпечатва оригиналната двойка ключ/стойност, последвана от новата двойка ключ/стойност.

Въпреки че можем да кажем, че „преименувахме“ ключа, ние всъщност просто създадохме нов ключ, копирахме съществуващата стойност към този нов ключ, след което изтрихме стария ключ, като го зададем на NULL .

В този случай използвахме JSON_VALUE() функция за извличане на стойността.

Числови стойности

Трябва да внимавате, когато копирате данните в новия ключ. По подразбиране SQL Server ще го огради в двойни кавички. Това може или не е това, което искате.

Въпреки това, ако копирате числова стойност, има вероятност да искате тя да остане числова стойност (т.е. без двойни кавички). В този случай ще трябва да използвате CAST() функция, за да го изведе като числов тип данни. Ето един пример:

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

Резултат:

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

Така че получената стойност е число.

Ако премахнем CAST() функция от този пример, в крайна сметка получаваме това:

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

Резултат:

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

Така че в този случай не просто преименувахме ключа, ние също така променихме типа данни (JSON) от число в низ.

Имайте предвид, че JSON не прави разлика между различни числови типове. Има само един числов тип:число.

Клавиши с интервали

В този пример преименувам съществуващ ключ на нов ключ, който съдържа интервал (състои се от две думи, разделени с интервал).

Тъй като новият ключ съдържа интервал, трябва да заобиколя ключа с двойни кавички. Ако не направя това, ще възникне грешка.

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

Резултат:

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

Вложени свойства

Ако имотът е вложен, няма проблем. Просто използвайте нотация с точки, за да го препратите.

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

Резултат:

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

Може също да сте забелязали, че този пример използва JSON_QUERY() функция за извличане на стойността, вместо JSON_VALUE() като в предишните примери.

Това е така, защото в този случай извличаме масив и JSON_VALUE() не може да извлече цял масив (може да извлече само скаларна стойност от масива). JSON_QUERY() функцията, от друга страна, извлича обекти и масиви, но не и скаларни стойности.

За да прочетете повече за това, вижте JSON_QUERY() срещу JSON_VALUE() :Каква е разликата?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е логически оператор в SQL Server - SQL Server / TSQL урок, част 123

  2. Разлика между sys.columns, sys.system_columns и sys.all_columns в SQL Server

  3. SET TEXTSIZE Не работи в SQL Server? Виж това.

  4. Заявка за актуализиране на SQL с помощта на съединения

  5. newid() вътре в sql сървърната функция