暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - JSON 函数 - 修改JSON值的函数(1)

数据库杂货铺 2021-09-07
543
修改JSON值的函数
 
本部分中的函数修改 JSON 值并返回结果。
 
 JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
 
将值追加到 JSON 文档中指定数组的末尾并返回结果。如果任何参数为 NULL,则返回 NULL。如果 json_doc 参数不是有效的 JSON 文档,或者任何 path 参数不是有效的路径表达式,或者包含 * ** 通配符,则会发生错误。
 
路径值对从左到右计算。对一对儿进行求值生成的文档将成为对下一对进行求值的新值。
 
如果路径选择了标量或对象值,则该值将自动包装在数组中,并将新值添加到该数组中。路径没有识别JSON文档中任何值的路径值对儿将被忽略。
 
    mysql> SET @j = '["a", ["b", "c"], "d"]';
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$[1]', 1);
    +----------------------------------+
    | JSON_ARRAY_APPEND(@j, '$[1]', 1) |
    +----------------------------------+
    | ["a", ["b", "c", 1], "d"] |
    +----------------------------------+
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$[0]', 2);
    +----------------------------------+
    | JSON_ARRAY_APPEND(@j, '$[0]', 2) |
    +----------------------------------+
    | [["a", 2], ["b", "c"], "d"] |
    +----------------------------------+
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$[1][0]', 3);
    +-------------------------------------+
    | JSON_ARRAY_APPEND(@j, '$[1][0]', 3) |
    +-------------------------------------+
    | ["a", [["b", 3], "c"], "d"] |
    +-------------------------------------+

    mysql> SET @j = '{"a": 1, "b": [2, 3], "c": 4}';
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$.b', 'x');
    +------------------------------------+
    | JSON_ARRAY_APPEND(@j, '$.b', 'x') |
    +------------------------------------+
    | {"a": 1, "b": [2, 3, "x"], "c": 4} |
    +------------------------------------+
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$.c', 'y');
    +--------------------------------------+
    | JSON_ARRAY_APPEND(@j, '$.c', 'y') |
    +--------------------------------------+
    | {"a": 1, "b": [2, 3], "c": [4, "y"]} |
    +--------------------------------------+

    mysql> SET @j = '{"a": 1}';
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$', 'z');
    +---------------------------------+
    | JSON_ARRAY_APPEND(@j, '$', 'z') |
    +---------------------------------+
    | [{"a": 1}, "z"] |
    +---------------------------------+
     
    MySQL 5.7 中,这个函数被命名为 JSON_APPEND()MySQL 8.0 不再支持该名称。
     
     JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
     
    更新JSON文档,插入到文档中的数组中并返回修改后的文档。如果任何参数为 NULL,则返回 NULL。如果 json_doc 参数不是一个有效的 JSON 文档,或者任何 path 参数不是有效的路径表达式,或者包含 * ** 通配符,或者不是以数组元素标识符结尾,则会发生错误。
     
    路径值对儿从左到右计算。在对一对儿进行求值生成的文档的基础上,再进行对下一对儿求值。
     
    路径没有识别 JSON 文档中任何数组的对儿将被忽略。如果路径确定了数组元素,则在该元素位置插入相应的值,随后的值将向右移动。如果路径识别数组位置超过数组的末端,则将该值插入到数组的末尾。
     
      mysql> SET @j = '["a", {"b": [1, 2]}, [3, 4]]';
      mysql> SELECT JSON_ARRAY_INSERT(@j, '$[1]', 'x');
      +------------------------------------+
      | JSON_ARRAY_INSERT(@j, '$[1]', 'x') |
      +------------------------------------+
      | ["a", "x", {"b": [1, 2]}, [3, 4]] |
      +------------------------------------+
      mysql> SELECT JSON_ARRAY_INSERT(@j, '$[100]', 'x');
      +--------------------------------------+
      | JSON_ARRAY_INSERT(@j, '$[100]', 'x') |
      +--------------------------------------+
      | ["a", {"b": [1, 2]}, [3, 4], "x"] |
      +--------------------------------------+
      mysql> SELECT JSON_ARRAY_INSERT(@j, '$[1].b[0]', 'x');
      +-----------------------------------------+
      | JSON_ARRAY_INSERT(@j, '$[1].b[0]', 'x') |
      +-----------------------------------------+
      | ["a", {"b": ["x", 1, 2]}, [3, 4]] |
      +-----------------------------------------+
      mysql> SELECT JSON_ARRAY_INSERT(@j, '$[2][1]', 'y');
      +---------------------------------------+
      | JSON_ARRAY_INSERT(@j, '$[2][1]', 'y') |
      +---------------------------------------+
      | ["a", {"b": [1, 2]}, [3, "y", 4]] |
      +---------------------------------------+
      mysql> SELECT JSON_ARRAY_INSERT(@j, '$[0]', 'x', '$[2][1]', 'y');
      +----------------------------------------------------+
      | JSON_ARRAY_INSERT(@j, '$[0]', 'x', '$[2][1]', 'y') |
      +----------------------------------------------------+
      | ["x", "a", {"b": [1, 2]}, [3, 4]] |
      +----------------------------------------------------+
       
      前面的修改会影响数组中后面元素的位置,因此同一个 JSON_ARRAY_INSERT() 调用中的后续路径应该考虑到这一点。在最后一个示例中,第二个路径不插入任何内容,因为该路径不再匹配第一次插入后的任何内容。
       
       JSON_INSERT(json_doc, path, val[, path, val] ...)
       
      将数据插入 JSON 文档并返回结果。如果任何参数为 NULL,则返回 NULL。如果 json_doc 参数不是一个有效的 JSON 文档,或者任何 path 参数不是一个有效的路径表达式,或者包含 * ** 通配符,则会发生错误。
       
      路径值对儿从左到右计算。对一对儿进行求值生成的文档将成为对下一对儿进行求值的新值。
       
      路径值对儿对应于文档中现有路径的情况将被忽略,不会覆盖现有文档值。对于文档中不存在的路径,如果路径明确为以下类型值之一,则将该值添加到文档中:
       
       在现有对象中不存在的成员。成员被添加到对象中并与新值相关联。
       
       超出已存在数组末端的位置。使用新值扩展数组。如果现有值不是数组,则自动将其包装为数组,然后使用新值进行扩展。
       
      否则,对应于文档中不存在路径的路径值对儿将被忽略,不起任何作用。
       
        mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
        mysql> SELECT JSON_INSERT(@j, '$.a', 10, '$.c', '[true, false]');
        +----------------------------------------------------+
        | JSON_INSERT(@j, '$.a', 10, '$.c', '[true, false]') |
        +----------------------------------------------------+
        | {"a": 1, "b": [2, 3], "c": "[true, false]"} |
        +----------------------------------------------------+
         
        结果中列出的最后一个值是一个带引号的字符串,而不是如同第二个那样,是数组(在输出中没有带引号),没有将值强制转换为 JSON 类型。要将数组插入为数组,必须显式执行强制类型转换,如下所示:
         
          mysql> SELECT JSON_INSERT(@j, '$.a', 10, '$.c', CAST('[true, false]' AS JSON));
          +------------------------------------------------------------------+
          | JSON_INSERT(@j, '$.a', 10, '$.c', CAST('[true, false]' AS JSON)) |
          +------------------------------------------------------------------+
          | {"a": 1, "b": [2, 3], "c": [true, false]} |
          +------------------------------------------------------------------+
          1 row in set (0.00 sec)
           
           JSON_MERGE(json_doc, json_doc[, json_doc] ...)
           
          合并两个或多个JSON文档。JSON_MERGE_PRESERVE() 的同义词,在 MySQL 8.0.3 中已弃用,可能会在以后的版本中移除。
           
            mysql> SELECT JSON_MERGE('[1, 2]', '[true, false]');
            +---------------------------------------+
            | JSON_MERGE('[1, 2]', '[true, false]') |
            +---------------------------------------+
            | [1, 2, true, false] |
            +---------------------------------------+
            1 row in set, 1 warning (0.00 sec)

            mysql> SHOW WARNINGS\G
            *************************** 1. row ***************************
            Level: Warning
            Code: 1287
            Message: 'JSON_MERGE' is deprecated and will be removed in a future release. \
            Please use JSON_MERGE_PRESERVE/JSON_MERGE_PATCH instead
            1 row in set (0.00 sec)
             
             JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
             
            对两个或多个 JSON 文档执行一个符合 RFC 7396 的的合并,并返回合并后的结果,不保留具有重复键的成员。如果作为参数传递给此函数的文档中有一个无效,则引发错误。
             
            JSON_MERGE_PATCH() 执行合并逻辑如下:
             
            A. 如果第一个参数不是对象,则合并的结果等同于空对象与第二个参数合并。
             
            B. 如果第二个参数不是对象,则合并的结果是第二个参数。
             
            C. 如果两个参数都是对象,则合并的结果是一个具有以下成员的对象:
             
             第一个对象的所有成员在第二个对象中没有具有相同键的对应成员。
             
             第二个对象的所有成员在第一个对象中没有对应的键,并且其值不是 JSON 空字面量。
             
             在第一个和第二个对象中存在相同键的所有成员,并且其值在第二个对象中不是 JSON 空字面值。这些成员的值是递归用第二个对象中的值合并第一个对象中的值的结果。
             
              mysql> SELECT JSON_MERGE_PATCH('[1, 2]', '[true, false]');
              +---------------------------------------------+
              | JSON_MERGE_PATCH('[1, 2]', '[true, false]') |
              +---------------------------------------------+
              | [true, false] |
              +---------------------------------------------+

              mysql> SELECT JSON_MERGE_PATCH('{"name": "x"}', '{"id": 47}');
              +-------------------------------------------------+
              | JSON_MERGE_PATCH('{"name": "x"}', '{"id": 47}') |
              +-------------------------------------------------+
              | {"id": 47, "name": "x"} |
              +-------------------------------------------------+

              mysql> SELECT JSON_MERGE_PATCH('1', 'true');
              +-------------------------------+
              | JSON_MERGE_PATCH('1', 'true') |
              +-------------------------------+
              | true |
              +-------------------------------+

              mysql> SELECT JSON_MERGE_PATCH('[1, 2]', '{"id": 47}');
              +------------------------------------------+
              | JSON_MERGE_PATCH('[1, 2]', '{"id": 47}') |
              +------------------------------------------+
              | {"id": 47} |
              +------------------------------------------+

              mysql> SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }',
              > '{ "a": 3, "c":4 }');
              +-----------------------------------------------------------+
              | JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }') |
              +-----------------------------------------------------------+
              | {"a": 3, "b": 2, "c": 4} |
              +-----------------------------------------------------------+

              mysql> SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }',
              > '{ "a": 5, "d":6 }');
              +-------------------------------------------------------------------------------+
              | JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }','{ "a": 5, "d":6 }') |
              +-------------------------------------------------------------------------------+
              | {"a": 5, "b": 2, "c": 4, "d": 6} |
              +-------------------------------------------------------------------------------+
               
              可以使用这个函数来删除一个成员,方法是在第二个参数中指定空作为该成员的值,如下所示:
               
                mysql> SELECT JSON_MERGE_PATCH('{"a":1, "b":2}', '{"b":null}');
                +--------------------------------------------------+
                | JSON_MERGE_PATCH('{"a":1, "b":2}', '{"b":null}') |
                +--------------------------------------------------+
                | {"a": 1} |
                +--------------------------------------------------+
                 
                这个例子展示了函数以递归的方式操作,也就是说,成员的值不限于标量,它们本身可以是JSON文档:
                 
                  mysql> SELECT JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}');
                  +----------------------------------------------------+
                  | JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}') |
                  +----------------------------------------------------+
                  | {"a": {"x": 1, "y": 2}} |
                  +----------------------------------------------------+
                   
                  MySQL 8.0.3 及以上版本支持 JSON_MERGE_PATCH()
                   
                   
                   
                  官方网址:
                  https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html
                  文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论