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を返す
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]
を参照して3番目の項目を更新します。 。
例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"] } } | +-------------------+
この例では、3番目の引数がJSON_QUERY()
に渡されることに注意してください。 働き。これを行わなかった場合、SQL Serverは円記号(\
を使用して二重引用符と角かっこをエスケープしていました。 )文字(したがって、配列を台無しにします)。更新された値が実際の配列なのか文字列リテラルなのかがわからなかったため、これが行われたはずです。
したがって、これを回避するには、JSON_QUERY()
を使用できます。 。この関数は有効なJSONを返し、SQLServerは新しい値が配列であると想定します。
しなかった場合は次のようになります。 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\"]" } } | +-------------------+
そのため、SQLServerは角かっこと二重引用符をエスケープしました。
例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
に設定します (自動的に削除されます)。
キーの名前を変更するその他の例については、SQLServerでJSONキーの名前を変更する方法を参照してください。