JSON_SET
📄字数 773
👁️阅读量 加载中...
功能描述
替换或插入新值,在一个JSON文本中插入或更新数据并返回新的JSON文本。
语法格式
sql
JSON_SET( json_doc, path, val[, path, val]... )
输入参数
json_doc
:JSON文本,JSON类型或字符类型。path
:路径表达式,字符类型。val
:新值,类型取值为NULL、布尔型、数值型、自定义类型(OBJECT、VARRAY、TABLE)、JSON类型以及其他能转换成字符型的类型。
输出结果
JSON类型。任意参数为NULL
时,输出结果为NULL
。
提示
- 从左到右计算新值,产生的新值用于后续计算。
- 文档中
path
存在值时,则使用新值替换。 - 若JSON文本为对象,路径表述为对象键且JSON文本中不存在相同的键,则该路径表述的对象键与
val
值将被作为新的键值对加入到JSON对象中。 - 路径表述为数组下标且处于JSON文本指定数组末尾之后,数组使用新值扩展。若路径指定值不为数组,则将其包装成数组,然后使用新值扩展。
- 除了上述两类不存在的路径的值将被忽略。
- 以下情况将导致系统抛出错误:
1.json_doc
是无效的JSON文档。
2. 任何path
是无效的路径表达式。
3. 路径表达式中包含*
或**
通配符。
示例
sql
-- 更新 x 键对应值并插入新的键值对
SQL> SELECT JSON_SET('{"x": 1}', '$.x', '10', '$.y', '[1, 2]');
+----------------------------+
| EXPR1 |
+----------------------------+
| {"x": "10", "y": "[1, 2]"} |
+----------------------------+
SQL> SELECT JSON_SET('{"x": 1}', '$.x', '10', '$.y', '{"z": 2}');
+--------------------------------+
| EXPR1 |
+--------------------------------+
| {"x": "10", "y": "{\"z\": 2}"} |
+--------------------------------+
SQL> SELECT JSON_SET('{"x": 1}', '$.x', '10', '$.y', CAST('[1, 2]' AS JSON));
+--------------------------+
| EXPR1 |
+--------------------------+
| {"x": "10", "y": [1, 2]} |
+--------------------------+
-- 新增数据下标在数组末尾之后
SQL> SELECT JSON_SET('[1, {"a": 2}]', '$[0]', 10, '$[1].b', 11, '$[3]', 12);
+-----------------------------+
| EXPR1 |
+-----------------------------+
| [10, {"a": 2, "b": 11}, 12] |
+-----------------------------+
-- JSON对象包装成数组后扩展
SQL> SELECT JSON_SET('{"a": 2}', '$[1]', 10);
+----------------+
| EXPR1 |
+----------------+
| [{"a": 2}, 10] |
+----------------+
-- JSON数组忽略对象键路径与值
SQL> SELECT JSON_SET('[1, {"a": 2}]', '$.a', 10);
+---------------+
| EXPR1 |
+---------------+
| [1, {"a": 2}] |
+---------------+