sql >> Databáze >  >> RDS >> Sqlserver

Příklady JSON_MODIFY() v SQL Server (T-SQL)

V SQL Server můžete použít T-SQL JSON_MODIFY() funkce pro úpravu hodnoty vlastnosti v řetězci JSON. Funkce vrací aktualizovaný řetězec JSON.

Syntaxe

Syntaxe vypadá takto:

JSON_MODIFY ( expression , path , newValue )

Kde expression je výraz řetězce JSON, path je cesta k vlastnosti, kterou chcete aktualizovat, a newValue je nová hodnota, která se má na tuto vlastnost použít.

Příklad 1 – Základní použití

Zde je příklad k demonstraci.

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

Výsledek:

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

V tomto příkladu:

  • {"Name": "Homer"} je původní řetězec JSON
  • $.Name je cesta (začíná $. následovaná cestou k vlastnosti, kterou chceme aktualizovat).
  • Bart je nová hodnota, kterou chceme přiřadit Name (tj. nahradit aktuální hodnotu)

Příklad 2 – Vrácení původního a upraveného JSON

Všimněte si, že JSON_MODIFY() nemění původní JSON. Vezme kopii, poté upraví a vrátí kopii.

Zde je příklad, který to demonstruje:

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

Výsledek:

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

Příklad 3 – Vnořené vlastnosti

Cesta může používat tečkovou notaci k odkazování na vnořené vlastnosti. Zde je příklad.

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

Výsledek:

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

Můžeme tedy vidět, že město bylo změněno z Dunedin na Timaru .

Příklad 4 – Aktualizace hodnot v poli

Můžete také aktualizovat hodnoty v poli. V tomto příkladu aktualizujeme hodnotu v Hobbies pole.

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

Výsledek:

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

Vzhledem k tomu, že pole používají číslování založené na nule, aktualizujeme třetí položku odkazem na Hobbies[2] .

Příklad 5 – Připojení hodnoty k poli

V tomto příkladu připojíme hodnotu k Hobbies pole. To provedeme přidáním append na začátku argumentu cesty.

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

Výsledek:

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

Příklad 6 – Aktualizace celého pole

V tomto příkladu aktualizuji celé pole.

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

Výsledek:

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

Všimněte si, že v tomto příkladu je třetí argument předán do JSON_QUERY() funkce. Kdybych to neudělal, SQL Server by dvojité uvozovky a hranaté závorky unikl pomocí zpětného lomítka (\ ) znak (a tedy zaneřádění pole). Udělal by to, protože by nevěděl, zda je aktualizovaná hodnota skutečné pole nebo řetězcový literál.

Abychom to obešli, můžeme použít JSON_QUERY() . Tato funkce vrátí platný JSON a SQL Server bude předpokládat, že nová hodnota je pole.

Co by se stalo, kdybychom nebyli použit 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';

Výsledek:

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

SQL Server tedy vynechal hranaté závorky a dvojité uvozovky.

Příklad 7 – Aktualizace celého objektu

Zde je příklad aktualizace celého objektu.

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

Výsledek:

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

Znovu, pokud bychom nepoužili JSON_QUERY() , dostali bychom řetězec s escapováním:

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

Výsledek:

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

Příklad 8 – Přejmenování klíče

Nejste omezeni pouze na aktualizaci hodnoty vlastnosti, můžete také přejmenovat její klíč. Zde je příklad.

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

Výsledek:

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

Zde vezmeme hodnotu ze stávající vlastnosti a přiřadíme ji k novému páru klíč/hodnota. Poté nastavíme hodnotu původního klíče na NULL (který jej automaticky smaže).

Další příklady přejmenování klíče najdete v tématu Jak přejmenovat klíč JSON na serveru SQL.


  1. Chyba serveru SQL - HRESULT E_FAIL byla vrácena z volání komponenty COM

  2. nullvalue:Zobrazit hodnoty NULL v SQLite

  3. SQL SELECT pro získání prvních N kladných celých čísel

  4. Automatický sběr dat změn databázového schématu na MS SQL Server