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"]} | +------------------------------------------------------------------+