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

MySQLのJSON_MERGE_PATCH()とJSON_MERGE_PRESERVE():違いは何ですか?

    MySQLには、JSONドキュメントを操作するための多くの関数が含まれています。これらの中には、JSON_MERGE_PATCH()があります。 およびJSON_MERGE_PRESERVE() 機能。

    これらの関数は両方とも、2つ以上のJSONドキュメントをマージし、結果を返します。ただし、これらの関数が異なる結果を返す場合があります。クエリに含める前に、これを知っておく必要があります。

    構文

    まず、各関数の構文は次のとおりです。

    JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
    JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
    

    json_docの場所 マージされるJSONドキュメントです。

    したがって、両方の関数は2つ以上の引数を受け入れ、それぞれがマージされるJSONドキュメントを表します。

    違い

    次の2つの例外を除いて、両方の関数はまったく同じように機能します。

    • JSON_MERGE_PATCH() 2番目のオブジェクトのキーに関連付けられた値がJSONnullでない場合、2番目のオブジェクトのキーが一致する最初のオブジェクトのメンバーを削除します。
    • 2番目のオブジェクトに、最初のオブジェクトのメンバーと一致するキーを持つメンバーがある場合、JSON_MERGE_PATCH() JSON_MERGE_PRESERVE()に対して、最初のオブジェクトの値を2番目のオブジェクトの値に置き換えます。 最初の値に2番目の値を追加します。

    したがって、基本的に、重複キーの処理方法が異なります。

    これら2つの機能の違いを示す例を次に示します。

    SELECT 
      JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH,
      JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;
    

    結果:

    +------------------+-----------------------------------+
    | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE               |
    +------------------+-----------------------------------+
    | {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} |
    +------------------+-----------------------------------+
    

    JSON_MERGE_PATCH()であることがわかります 最初のオブジェクトの値を置き換えました(Bartholomew )2番目のオブジェクト値(Bart

    JSON_MERGE_PRESERVE() 一方、配列を作成し、両方の値を入力しました。

    例2–アレイ

    同じ名前の2つの配列をマージする例を次に示します。

    SELECT 
      JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH,
      JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;
    

    結果:

    +--------------------------------+-------------------------------------------------------+
    | JSON_MERGE_PATCH               | JSON_MERGE_PRESERVE                                   |
    +--------------------------------+-------------------------------------------------------+
    | {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} |
    +--------------------------------+-------------------------------------------------------+
    

    したがって、この場合、JSON_MERGE_PATCH() 最初の配列のすべての要素を2番目の配列の要素に置き換えました。

    JSON_MERGE_PRESERVE() 両方の配列の値を1つに単純に結合しました。

    明らかに、配列の名前が異なる場合、それらは別々の配列になります(ただし、同じJSONドキュメント内にあります)。したがって、このような場合、両方の関数が同じ結果を返します。

    SELECT 
      JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result
    UNION ALL
    SELECT 
      JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');
    

    結果:

    +------------------------------------------------------------------+
    | Result                                                           |
    +------------------------------------------------------------------+
    | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
    | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
    +------------------------------------------------------------------+
    

    1. proxysql-admin代替-ClusterControlProxySQLGUI

    2. Postgres pg_dumpは、毎回異なる順序でデータベースをダンプします

    3. Rails 3.1:時間範囲内のレコードのPostgresへのクエリ

    4. SQLServerログ配布を構成する