JSON_INSERT
描述
JSON_INSERT
函数用于在 JSON 中插入数据并返回结果。
语法
JSON_INSERT (<json_object>, <path>, <value>[, <path>, <value>, ...])
参数
<json_object>
JSON 类型表达式,被修改的目标。<path>
String 类型表达式,指定插入值的路径<value>
JSON 类型或其他TO_JSON
支持的类型,要插入的值。
返回值
Nullable(JSON)
返回被修改后的 JSON 对象
使用说明
- 需要注意的是,路径值对按从左到右的顺序进行评估。
- 如果
<path>
指向的值在 JSON 对象中已经存在,不会产生任何影响。 <path>
中不能包含通配符,如果包含通配符会报错。- 如果
<path>
中包含多层路径,除了最后一层路径其他路径必须存在于 JSON 对象中。 - 如果
<path>
指向的是某个数组成员元素,但实际上这个对象并不是数组,那么会将该对象转换为数组的第一个成员,然后按照正常的数组处理。 <json_object>
或者<path>
为 NULL 时,会得到 NULL,如果<value>
为 NULL 会插入一个 JSON 的 null 值。
示例
- 路径值对按从左到右的顺序进行评估
select json_insert('{}', '$.k', json_parse('{}'), '$.k.k2', 123);
+-----------------------------------------------------------+
| json_insert('{}', '$.k', json_parse('{}'), '$.k.k2', 123) |
+-----------------------------------------------------------+
| {"k":{"k2":123}} |
+-----------------------------------------------------------+ <path>
指向的值在 JSON 对象中已经存在select json_insert('{"k": 1}', "$.k", 2);
+-----------------------------------+
| json_insert('{"k": 1}', "$.k", 2) |
+-----------------------------------+
| {"k":1} |
+-----------------------------------+<path>
不能包含通配符select json_insert('{"k": 1}', "$.*", 2);
ERROR 1105 (HY000): errCode = 2, detailMessage = [INVALID_ARGUMENT] In this situation, path expressions may not contain the * and ** tokens or an array range, argument index: 1, row index: 0
- 无法创建多层路径
+--------------------------------------+
| json_insert('{}', '$.k1.k2.k3', 123) |
+--------------------------------------+
| {} |
+--------------------------------------+ - 自动转换为数组的情况
select json_insert('{"k": "v"}', '$[1]', 123);
+----------------------------------------+
| json_insert('{"k": "v"}', '$[1]', 123) |
+----------------------------------------+
| [{"k": "v"}, 123] |
+----------------------------------------+select json_insert('{"k": "v"}', '$.k[1]', 123);
+------------------------------------------+
| json_insert('{"k": "v"}', '$.k[1]', 123) |
+------------------------------------------+
| {"k": ["v", 123]} |
+------------------------------------------+ - NULL 参数
select json_insert(NULL, '$[1]', 123);
+--------------------------------+
| json_insert(NULL, '$[1]', 123) |
+--------------------------------+
| NULL |
+--------------------------------+select json_insert('{"k": "v"}', NULL, 123);
+--------------------------------------+
| json_insert('{"k": "v"}', NULL, 123) |
+--------------------------------------+
| NULL |
+--------------------------------------+select json_insert('{"k": "v"}', '$.k[1]', NULL);
+-------------------------------------------+
| json_insert('{"k": "v"}', '$.k[1]', NULL) |
+-------------------------------------------+
| {"k": ["v", null]} |
+-------------------------------------------+