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řaditName
(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.