MariaDB JSON_INSERT() 函数使用指南
在 MariaDB 中,JSON_INSERT()
是一个内置函数,它向一个 JSON 文档中插入一个或多个数据并返回新的 JSON 文档。
你也可以使用 JSON_REPLACE()
和 JSON_SET()
修改一个 JSON 文档。
MariaDB JSON_INSERT()
语法
这里是 MariaDB JSON_INSERT()
的语法:
JSON_INSERT(json, path, value[, path2, value2] ...)
参数
json
- 必需的。被修改的 JSON 文档。
path
- 必需的。一个有效的路径表达式,它不能包含
*
或**
。 value
- 必需的。被插入的数据。
如果您提供了错误数量的参数,MariaDB 将报告一个错误: ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
。
返回值
MariaDB JSON_INSERT()
函数向一个 JSON 文档中插入数据并返回新的 JSON 文档。您可以提供多对 path-value
参数,以便一次插入多个数据。
MariaDB JSON_INSERT()
函数只能将数据插入到不存在路径。如果 JSON 文档中已经存在指定的路径,则不会插入数据。
如果 value
为字符串, JSON_INSERT()
函数会将其作为字符串写入到 JSON 文档中。为了保证写入到 JSON 文档中的值的类型正确,请对 value
使用 JSON
类型的数据。
如果 path
为 $
,JSON_INSERT()
函数会返回原 JSON 文档。
如果 JSON 文档或者路径为 NULL
,此函数将返回 NULL
。
MariaDB JSON_INSERT()
示例
基本示例
让我们首先创建一个 JSON 文档以便于演示下面的示例:
SET @array = '[1, [2, 3], {"a": [4, 5]}]';
使用下面的语句像 JSON 数组中插入数据:
SELECT JSON_INSERT(@array, '$[0]', 0, '$[3]', 6);
输出:
+-------------------------------------------+
| JSON_INSERT(@array, '$[0]', 0, '$[3]', 6) |
+-------------------------------------------+
| [1, [2, 3], {"a": [4, 5]}, 6] |
+-------------------------------------------+
在本示例中,我们想要在数组的开头插入 0
,在数组的尾部插入 6
。
我们发现,并没有在数据的开头($[0]
)插入数据。这是因为数组在 $[0]
位置已经有了值,因此不会插入。而数组在 $[3]
位置是没有数据的,因此 6
被插入到数组的尾部。
您还可以使用 JSON_ARRAY_APPEND()
向数组尾部追加数据。
插入 JSON 类型数据
除了插入简单的字面值,我们还可以插入复杂的 JSON 元素,比如数组和对象。
让我们首先创建一个包含 JSON 对象的 JSON 文档:
SET @obj = '{"x": 1}';
现在让我们插入一个值为 true
的成员 y
:
SELECT JSON_INSERT(@obj, '$.y', 'true');
输出:
+----------------------------------+
| JSON_INSERT(@obj, '$.y', 'true') |
+----------------------------------+
| {"x": 1, "y": "true"} |
+----------------------------------+
我们发现, true
变成了 "true"
。而不是我们希望的 {"x": 1, "y": true}
。
这是因为,如果 value
参数为字符串, JSON_INSERT()
函数会将其作为字符串写入到 JSON 文档中。我们再看几个相似的例子:
SELECT JSON_INSERT(@obj, '$.y', '[1, 2]');
输出:
+------------------------------------+
| JSON_INSERT(@obj, '$.y', '[1, 2]') |
+------------------------------------+
| {"x": 1, "y": "[1, 2]"} |
+------------------------------------+
或者
SELECT JSON_INSERT(@obj, '$.y', '{"z": 2}');
输出:
+--------------------------------------+
| JSON_INSERT(@obj, '$.y', '{"z": 2}') |
+--------------------------------------+
| {"x": 1, "y": "{\"z\": 2}"} |
+--------------------------------------+
为了解决这个问题,我们可以使用 JSON_EXTRACT()
函数将数据转为 JSON 类型,比如:
SELECT JSON_INSERT(@obj, '$.y', JSON_EXTRACT('{"z": 2}', '$'));
输出:
+---------------------------------------------------------+
| JSON_INSERT(@obj, '$.y', JSON_EXTRACT('{"z": 2}', '$')) |
+---------------------------------------------------------+
| {"x": 1, "y": {"z": 2}} |
+---------------------------------------------------------+
您也可以使用 JSON_QUERY()
或者 JSON_VALUE()
。
参数计数不正确
不提供参数会导致错误:
SELECT JSON_INSERT();
输出:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
当您提供的参数太少或太多时,情况也是如此:
SELECT JSON_INSERT('{ "a": 1}');
输出:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
结论
在 MariaDB 中,JSON_INSERT()
是一个内置函数,它向一个 JSON 文档中插入一个或多个数据并返回新的 JSON 文档。