JSON_MODIFY()
を使用している場合 SQL ServerでJSONドキュメントを変更する関数を使用すると、値を変更することに慣れている可能性があります。 キー/値の一部 財産。しかし、キーも変更できることをご存知でしたか 一部?
これを行う秘訣は、値を新しいキーにコピーしてから、古いキーを削除することです。
以下の例。
基本的な例
これが私が何を意味するかを示すための基本的な例です。
-- 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()
を使用しました 値を抽出する関数。
数値
データを新しいキーにコピーするときは注意が必要です。デフォルトでは、SQLServerはそれを二重引用符で囲みます。これはあなたが望むものかもしれないし、そうでないかもしれません。
ただし、数値をコピーする場合は、数値のままにする(つまり、二重引用符を付けない)ようにしたい場合があります。この場合、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は異なる数値タイプを区別しないことに注意してください。数値タイプは数値のみです。
スペースのあるキー
この例では、既存のキーの名前を、スペースを含む新しいキーに変更します(スペースで区切られた2つの単語で構成されます)。
新しいキーにはスペースが含まれているため、キーを二重引用符で囲む必要があります。これを行わないと、エラーが発生します。
-- 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()
をご覧ください。 vs JSON_VALUE()
:違いは何ですか?