MySQLには、JSONドキュメントの操作に役立つ関数がいくつかあります。これには、JSON_SET()が含まれます 、JSON_INSERT() 、およびJSON_REPLACE() 機能。
これらの3つの機能は関連していますが、わずかに異なります。
構文
まず、3つの関数すべての構文は次のとおりです。
JSON_SET(json_doc, path, val[, path, val] ...) JSON_INSERT(json_doc, path, val[, path, val] ...) JSON_REPLACE(json_doc, path, val[, path, val] ...)
したがって、3つの関数はすべて同じ引数を受け入れます。これらの議論の目的は次のとおりです。
-
json_docJSONドキュメントです。 pathデータを挿入したり、値を更新したりする要素のパスです。-
valは新しい値です。
違い
これらの機能の違いは次のとおりです。
-
JSON_SET()既存の値を置き換え、存在しない値を追加します。 -
JSON_INSERT()既存の値を置き換えずに値を挿入します。 -
JSON_REPLACE()既存の値のみを置き換えます。
したがって、基本的にどちらを使用するかは、既存の値を更新するか、新しい値を挿入するかによって異なります(ただし、JSON_SET() 両方を行います。
例1-値を挿入する
これら3つの機能の違いを示す例を次に示します。
JSON_SET()
JSON_SET()を使用して新しい値を挿入しようとするとどうなりますか。 :
SELECT JSON_SET('{"a": 1, "b": 2}', '$.c', 3) AS 'Result';
結果:
+--------------------------+
| Result |
+--------------------------+
| {"a": 1, "b": 2, "c": 3} |
+--------------------------+
完璧に機能しました。
JSON_INSERT()
JSON_INSERT()を使用して新しい値を挿入しようとするとどうなりますか。 :
SELECT JSON_INSERT('{"a": 1, "b": 2}', '$.c', 3) AS 'Result';
結果:
+--------------------------+
| Result |
+--------------------------+
| {"a": 1, "b": 2, "c": 3} |
+--------------------------+
JSON_SET()の場合とまったく同じ結果 。
JSON_REPLACE()
JSON_REPLACE()を使用して新しい値を挿入しようとするとどうなりますか。 :
SELECT JSON_REPLACE('{"a": 1, "b": 2}', '$.c', 3) AS 'Result';
結果:
+------------------+
| Result |
+------------------+
| {"a": 1, "b": 2} |
+------------------+
この場合、新しい値は挿入されませんでした。元のJSONドキュメントは変更されずに返されます。これは、この関数が既存の値を置き換えるだけであり、新しい値を挿入しないためです。
例2–既存の値を更新する
次に、既存の値を更新します。
JSON_SET()
JSON_SET()を使用して既存の値を更新しようとするとどうなりますか。 :
SELECT JSON_SET('{"a": 1, "b": 2}', '$.b', 3) AS 'Result';
結果:
+------------------+
| Result |
+------------------+
| {"a": 1, "b": 3} |
+------------------+
繰り返しになりますが、完全に機能しました。 2番目のキーと値のペアを新しい値で正常に更新しました。
JSON_INSERT()
JSON_INSERT()を使用して既存の値を更新しようとするとどうなりますか。 :
SELECT JSON_INSERT('{"a": 1, "b": 2}', '$.b', 3) AS 'Result';
結果:
+------------------+
| Result |
+------------------+
| {"a": 1, "b": 2} |
+------------------+
この場合、既存の値は更新されませんでした。 JSONドキュメントは変更されずに返されます。これは、JSON_INSERT()が原因です。 関数は新しい値を挿入するだけで、既存の値は更新しません。
JSON_REPLACE()
JSON_REPLACE()を使用して既存の値を更新しようとするとどうなりますか。 :
SELECT JSON_REPLACE('{"a": 1, "b": 2}', '$.b', 3) AS 'Result';
結果:
+------------------+
| Result |
+------------------+
| {"a": 1, "b": 3} |
+------------------+
完全に更新されます。