MySQLでは、JSON_REMOVE()
関数はJSONドキュメントからデータを削除し、結果を返します。
最初の引数としてJSONドキュメントを指定し、その後にデータを削除するパスを指定します。必要に応じて、複数のパスを指定できます。
構文
構文は次のようになります:
JSON_REMOVE(json_doc, path[, path] ...)
json_doc
の場所 はJSONドキュメントであり、path
はデータを削除するためのパスです。
path
引数は左から右に評価されます。 1つのパスを評価することによって作成されたドキュメントは、次のパスが評価される新しい値になります。
最初の引数は有効なJSONドキュメントである必要があります。そうでない場合、エラーが発生します。
また、path
引数は有効なパス式である必要があり、$
にすることはできません または*
が含まれています または**
ワイルドカードを指定しないと、エラーが発生します。
例1-基本的な使用法
実例を示します。
SELECT JSON_REMOVE('{"a": 1, "b": 2, "c": 3}', '$.b') AS 'Result';
結果:
+------------------+ | Result | +------------------+ | {"a": 1, "c": 3} | +------------------+
この場合、b
のキーを持つキーと値のペアを削除しました 。これは、$.b
を指定したためです。 2番目の引数として。
別の例を次に示します。
SELECT JSON_REMOVE('{"Name": "Homer", "Gender": "Male", "Age": 39}', '$.Age') AS 'Result';
結果:
+-------------------------------------+ | Result | +-------------------------------------+ | {"Name": "Homer", "Gender": "Male"} | +-------------------------------------+
例2–存在しないパス
存在しないパスを指定すると、何も削除されません。元のJSONドキュメントは変更なしで返されます。
SELECT JSON_REMOVE('{"Name": "Homer", "Age": 39}', '$.Gender') AS 'Result';
結果:
+------------------------------+ | Result | +------------------------------+ | {"Age": 39, "Name": "Homer"} | +------------------------------+
例3–アレイ
配列を使用した例を次に示します。
SELECT JSON_REMOVE('[1, 2, 3]', '$[0]') AS 'Result';
結果:
+--------+ | Result | +--------+ | [2, 3] | +--------+
配列はゼロベースの番号付けを使用するため、この場合、最初の要素が配列から削除されます。
別の配列の例を次に示します。今回は、ネストされた配列から値を削除します。
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]') AS 'Result';
結果:
+----------------+ | Result | +----------------+ | [1, 2, [3, 5]] | +----------------+
例4–複数のパス
複数のパスを指定して、JSONドキュメントの複数の場所からデータを削除できます。
基本的な例:
SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[1]', '$[3]') AS 'Result';
結果:
+-----------+ | Result | +-----------+ | [1, 3, 4] | +-----------+
前述のように、path
引数は左から右に評価され、1つのパスを評価することによって作成されたドキュメントは、次のパスが評価される新しい値になります。
したがって、この例では、2番目のパス引数は、それが唯一のパス引数であった場合に削除した値とは異なる値を削除します。それが唯一のパス引数だったとしたら、4
は削除されたでしょう。 。
意味は次のとおりです:
SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[3]') AS 'One Path', JSON_REMOVE('[1, 2, 3, 4, 5]', '$[1]', '$[3]') AS 'Two Paths';
結果:
+--------------+-----------+ | One Path | Two Paths | +--------------+-----------+ | [1, 2, 3, 5] | [1, 3, 4] | +--------------+-----------+
したがって、$[3]
を使用するとわかります 唯一のパスとして、4
を削除します アレイから。ただし、2番目のパスとして使用すると、5
が削除されます。 (および4
手つかずのままです。
別の例、今回は配列とネストされた配列から値を削除します:
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[0]', '$[1][1]') AS 'Result';
結果:
+-------------+ | Result | +-------------+ | [2, [3, 5]] | +-------------+
繰り返しになりますが、配列が2
の位置にある場合でも 元のドキュメントでは、最初のパス値($[0]
)外側の配列を切り詰めると、内側の配列が1
の位置に変わります。 。
これにより頭が回転する場合は、いつでもパス引数を入れ替えて、右端の値が最初に削除されるようにすることができます。そうすれば、左端の値の位置に影響を与えないため、元のJSONドキュメントに基づいてパスを指定できます。
したがって、前のコードを次のように変更して、同じ結果を得ることができます。
SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]', '$[0]') AS 'Result';
結果:
+-------------+ | Result | +-------------+ | [2, [3, 5]] | +-------------+
例5–より大きなJSONドキュメント
これは(少し)大きいJSONドキュメントの例です。
SET @data = '{ "Person": { "Name": "Homer", "Age": 39, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }'; SELECT JSON_REMOVE(@data, '$.Person.Age', '$.Person.Hobbies[2]') AS 'Result';
結果:
+------------------------------------------------------------------+ | Result | +------------------------------------------------------------------+ | {"Person": {"Name": "Homer", "Hobbies": ["Eating", "Sleeping"]}} | +------------------------------------------------------------------+