MariaDB JSON_REPLACE() 函数使用指南
在 MariaDB 中,JSON_REPLACE()
是一个内置函数,它在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档。
您可以使用该 JSON_INSERT()
函数向 JSON 文档中插入新数据,使用该 JSON_SET()
函数向 JSON 文档中插入新数据活更新现有数据。
MariaDB JSON_REPLACE()
语法
这里是 MariaDB JSON_REPLACE()
的语法:
JSON_REPLACE(json, path, value[, path2, value2] ...)
参数
json
- 必需的。被修改的 JSON 文档。
path
- 必需的。一个有效的路径表达式,它不能包含
*
或**
。 value
- 必需的。新的数据。
如果您提供了错误数量的参数,MariaDB 将报告一个错误: ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REPLACE'
。
返回值
MariaDB JSON_REPLACE()
函数在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档。您可以提供多对 path-value
参数,以便一次替换多个数据。
MariaDB JSON_REPLACE()
函数只能替换已经存在的数据。如果 JSON 文档中不存在指定的路径,则不会插入数据。
如果 value
为字符串, JSON_REPLACE()
函数会将其作为字符串写入到 JSON 文档中。
如果 JSON 文档或者路径为 NULL
,此函数将返回 NULL
。
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}"} |
+---------------------------------------+
为了解决这个问题,我们可以使用 JSON_EXTRACT()
函数将数据转为 JSON 类型,比如:
SELECT JSON_REPLACE(@obj, '$.x', JSON_EXTRACT('{"z": 2}', '$'));
输出:
+----------------------------------------------------------+
| JSON_REPLACE(@obj, '$.x', JSON_EXTRACT('{"z": 2}', '$')) |
+----------------------------------------------------------+
| {"x": {"z": 2}} |
+----------------------------------------------------------+
您也可以使用 JSON_QUERY()
或者 JSON_VALUE()
。
结论
在 MariaDB 中,JSON_REPLACE()
是一个内置函数,它在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档。