跳到主要内容

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 对象

使用说明

  1. 需要注意的是,路径值对按从左到右的顺序进行评估。
  2. 如果 <path> 指向的值在 JSON 对象中已经存在,不会产生任何影响。
  3. <path> 中不能包含通配符,如果包含通配符会报错。
  4. 如果 <path> 中包含多层路径,除了最后一层路径其他路径必须存在于 JSON 对象中。
  5. 如果 <path> 指向的是某个数组成员元素,但实际上这个对象并不是数组,那么会将该对象转换为数组的第一个成员,然后按照正常的数组处理。
  6. <json_object> 或者 <path> 为 NULL 时,会得到 NULL,如果 <value> 为 NULL 会插入一个 JSON 的 null 值。

示例

  1. 路径值对按从左到右的顺序进行评估
    select json_insert('{}', '$.k', json_parse('{}'), '$.k.k2', 123);
    +-----------------------------------------------------------+
    | json_insert('{}', '$.k', json_parse('{}'), '$.k.k2', 123) |
    +-----------------------------------------------------------+
    | {"k":{"k2":123}} |
    +-----------------------------------------------------------+
  2. <path> 指向的值在 JSON 对象中已经存在
    select json_insert('{"k": 1}', "$.k", 2);
    +-----------------------------------+
    | json_insert('{"k": 1}', "$.k", 2) |
    +-----------------------------------+
    | {"k":1} |
    +-----------------------------------+
  3. <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
  4. 无法创建多层路径
        
    +--------------------------------------+
    | json_insert('{}', '$.k1.k2.k3', 123) |
    +--------------------------------------+
    | {} |
    +--------------------------------------+
  5. 自动转换为数组的情况
    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]} |
    +------------------------------------------+
  6. 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]} |
    +-------------------------------------------+