MySQL JSON_REPLACE() 函数使用指南

MySQL JSON_REPLACE() 函数在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档。

JSON_REPLACE() 语法

这里是 MySQL JSON_REPLACE() 的语法:

JSON_REPLACE(json, path, value[, path2, value2] ...)

参数

json
必需的。被修改的 JSON 文档。
path
必需的。一个有效的路径表达式,它不能包含 ***
value
必需的。新的数据。

返回值

JSON_REPLACE() 函数在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档。您可以提供多对 path-value 参数,以便一次替换多个数据。

JSON_REPLACE() 函数只能替换已经存在的数据。如果 JSON 文档中不存在指定的路径,则不会插入数据。

如果 value 为字符串, JSON_REPLACE() 函数会将其作为字符串写入到 JSON 文档中。

如果 JSON 文档或者路径为 NULL,此函数将返回 NULL

JSON_REPLACE() 函数将在以下情况下返回错误:

  • 如果参数 json 不是有效的 JSON 文档,MySQL 将会给出错误。您可以使用 JSON_VALID() 验证 JSON 文档的有效性。
  • 如果参数 path 不是有效的路径表达式或者其中包含 ***, MySQL 将会给出错误。

JSON_REPLACE() 示例

在数组中替换

让我们首先创建一个 JSON 文档以便于演示下面的示例:

SET @array = '[1, [2, 3]]';

让我们将数组的第一个元素和第三个元素替换为新值:

SELECT JSON_REPLACE(@array, '$[0]', 0, '$[2]', 6);

这里,我们想要把数组的将第一个元素替换为 0,将数组的第三个元素替换为 6。让我们看一下结果:

+--------------------------------------------+
| JSON_REPLACE(@array, '$[0]', 0, '$[2]', 6) |
+--------------------------------------------+
| [0, [2, 3]]                                |
+--------------------------------------------+

我们发现,数组的第一个元素成功的被替换为了 0。然后,数组的最后没有插入 6。这是因为 JSON_REPLACE() 函数只替换已经存在的数据。

写入 JSON 类型数据

让我们首先创建一个包含 JSON 对象的 JSON 文档:

SET @obj = '{"x": 1}';

现在让我们将对象中的 x 的成员修改为 true:

SELECT JSON_REPLACE(@obj, '$.x', 'true');
+-----------------------------------+
| JSON_REPLACE(@obj, '$.x', 'true') |
+-----------------------------------+
| {"x": "true"}                     |
+-----------------------------------+

我们发现, true 变成了 "true"。而不是我们希望的 {"x": true}

这是因为,如果 value 参数为字符串, JSON_REPLACE() 函数会将其作为字符串写入到 JSON 文档中。我们再看几个相似的例子:

SELECT JSON_REPLACE(@obj, '$.x', '[1, 2]');
+-------------------------------------+
| JSON_REPLACE(@obj, '$.x', '[1, 2]') |
+-------------------------------------+
| {"x": "[1, 2]"}                     |
+-------------------------------------+

或者

SELECT JSON_REPLACE(@obj, '$.x', '{"z": 2}');
+---------------------------------------+
| JSON_REPLACE(@obj, '$.x', '{"z": 2}') |
+---------------------------------------+
| {"x": "{\"z\": 2}"}                   |
+---------------------------------------+

为了解决这个问题,我们可以使用 CAST() 函数将数据转为 JSON 类型,比如:

SELECT JSON_REPLACE(@obj, '$.x', CAST('{"z": 2}' AS JSON));
+-----------------------------------------------------+
| JSON_REPLACE(@obj, '$.x', CAST('{"z": 2}' AS JSON)) |
+-----------------------------------------------------+
| {"x": {"z": 2}}                                     |
+-----------------------------------------------------+