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

JSON_MODIFY() Примери в SQL Server (T-SQL)

В SQL Server можете да използвате T-SQL JSON_MODIFY() функция за промяна на стойността на свойство в JSON низ. Функцията връща актуализирания JSON низ.

Синтаксис

Синтаксисът е така:

JSON_MODIFY ( expression , path , newValue )

Където expression е низовият израз на JSON, path е пътят към свойството, което искате да актуализирате, и newValue е новата стойност, която да се приложи към това свойство.

Пример  1 – Основна употреба

Ето пример за демонстрация.

SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';

Резултат:

+------------------+
| Result           |
|------------------|
| {"Name": "Bart"} |
+------------------+

В този пример:

  • {"Name": "Homer"} е оригиналният JSON низ
  • $.Name е пътят (това започва с $. последвано от пътя към свойството, което искаме да актуализираме).
  • Bart е новата стойност, която искаме да присвоим на Name (т.е. за замяна на текущата стойност)

Пример 2 – Връщане на оригиналния и модифициран JSON

Имайте предвид, че JSON_MODIFY() не променя оригиналния JSON. Той взема копие, след което променя и връща копието.

Ето пример за демонстриране на това:

DECLARE @suspect NVARCHAR(4000)
SET @suspect= '{"Name": "Homer"}'
SELECT 
  @suspect AS 'Original String',
  JSON_MODIFY(@suspect, '$.Name', 'Bart') AS 'Modified String',
  @suspect AS 'Original String';

Резултат:

+-------------------+-------------------+-------------------+
| Original String   | Modified String   | Original String   |
|-------------------+-------------------+-------------------|
| {"Name": "Homer"} | {"Name": "Bart"}  | {"Name": "Homer"} |
+-------------------+-------------------+-------------------+

Пример 3 – Вложени свойства

Пътят може да използва нотация с точки за препращане към вложени свойства. Ето един пример.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect.Address.City', 'Timaru') AS 'Modified Array';

Резултат:

+------------------+
| Modified Array   |
|------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Timaru",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }                  |
+------------------+

Така че можем да видим, че градът е променен от Dunedin до Timaru .

Пример 4 – Актуализиране на стойности в масив

Можете също да актуализирате стойности в рамките на масив. В този пример актуализираме стойност в Hobbies масив.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect.Hobbies[2]', 'Brain Surgery') AS 'Updated Hobbies';

Резултат:

+-------------------+
| Updated Hobbies   |
|-------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Brain Surgery"]  
    }
 }                   |
+-------------------+

Виждайки, че масивите използват номериране на база нула, ние актуализираме третия елемент, като препращаме Hobbies[2] .

Пример 5 – Добавяне на стойност към масив

В този пример добавяме стойност към Hobbies масив. Правим това, като добавяме append в началото на аргумента за пътя.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'append $.Suspect.Hobbies', 'Brain Surgery') AS 'Updated Hobbies';

Резултат:

+-------------------+
| Updated Hobbies   |
|-------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"]  
    }
 }                   |
+-------------------+

Пример 6 – Актуализиране на цял масив

В този пример актуализирам целия масив.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect.Hobbies', JSON_QUERY('["Chess", "Brain Surgery"]')) AS 'Updated Hobbies';

Резултат:

+-------------------+
| Updated Hobbies   |
|-------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Chess", "Brain Surgery"]  
    }
 }                   |
+-------------------+

Обърнете внимание, че в този пример третият аргумент се предава на JSON_QUERY() функция. Ако не бях направил това, SQL Server щеше да избяга от двойните кавички и квадратните скоби, използвайки обратната наклонена черта (\ ) символ (и следователно объркване на масива). Щеше да направи това, защото нямаше да знае дали актуализираната стойност е действителен масив или низов литерал.

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

Ето какво щеше да се случи, ако не бяхме използва JSON_QUERY() :

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect.Hobbies', '["Chess", "Brain Surgery"]') AS 'Updated Hobbies';

Резултат:

+-------------------+
| Updated Hobbies   |
|-------------------|
| {  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Address": {    
         "City": "Dunedin",  
         "Region": "Otago",  
         "Country": "New Zealand"  
       },  
       "Hobbies": "[\"Chess\", \"Brain Surgery\"]"  
    }
 }                   |
+-------------------+

Така SQL Server е избягал от квадратните скоби и двойните кавички.

Пример 7 – Актуализиране на цял обект

Ето пример за актуализиране на цял обект.

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect', JSON_QUERY('{"Name": "Peter Griffin", "Hobbies": "None"}')) AS 'Updated Object';

Резултат:

+------------------+
| Updated Object   |
|------------------|
| {  
    "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"}
 }                  |
+------------------+

Отново, ако не бяхме използвали JSON_QUERY() , щяхме да получим екраниран низ:

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",  
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_MODIFY(@data,'$.Suspect', '{"Name": "Peter Griffin", "Hobbies": "None"}') AS 'Updated Object';

Резултат:

+------------------+
| Updated Object   |
|------------------|
| {  
    "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}"
 }                  |
+------------------+

Пример 8 – Преименуване на ключ

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

DECLARE @data NVARCHAR(50)='{"Name":"Homer"}'
PRINT @data

-- Rename the key
SET @data=
 JSON_MODIFY(
  JSON_MODIFY(@data,'$.Handle', JSON_VALUE(@data,'$.Name')),
  '$.Name',
  NULL
 )
PRINT @data

Резултат:

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

Тук вземаме стойността от съществуващото свойство и я присвояваме на нова двойка ключ/стойност. След това задаваме стойността на оригиналния ключ на NULL (което автоматично го изтрива).

За повече примери за преименуване на ключ вижте Как да преименувате JSON ключ в SQL Server.


  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 AlwaysOn (група за наличност) и инсталация стъпка по стъпка -1

  2. scope_identity срещу ident_current

  3. Как да изберете дата без час в SQL

  4. Външен ключ към множество таблици

  5. Обединете два дяла в един в SQL Server (T-SQL)