sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)でJSONキーの名前を変更する方法

    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() :違いは何ですか?


    1. mysqldumpからダンプファイルを復元するにはどうすればよいですか?

    2. MAX対トップ1-どちらが良いですか?

    3. MySQLShowユーザー

    4. MySQL FULL JOIN?