Mysql8.0之JSON函数

Mysql8.0之JSON函数

官方参考手册:https://dev.mysql.com/doc/refman/8.0/en/json-functions.html

image-20220922142950171

MYSQL5.7.8开始,就支持JSON数据类型的存储了。

1.Json函数

  • 创建Json值的函数

    • JSON_ARRAY(): 创建json数组

      SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
      

      image-20220922144808701

    • JSON_OBJECT: 创建json对象

      SELECT JSON_OBJECT('id', 87, 'name', 'carrot');
      

      image-20220922144627949

    • JSON_QUOTE(string) : 通过用双引号字符包装字符串并转义内部引号和其他字符,将字符串引用为 JSON 值,然后将结果作为 utf8mb4字符串返回

      SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"');
      

      image-20220922144450545

  • 搜索Json值的函数

    • JSON_CONTAINS(target,condicate[,path])

      通过返回 1 或 0 来指示给定的 candidateJSON 文档是否包含在targetJSON 文档中,或者(如果path 提供了参数)是否在目标内的特定路径中找到候选对象

      SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
      SET @j2 = '1';
      SELECT JSON_CONTAINS(@j, @j2, '$.a'); -- 其中$表示json字符串本身,$.a表示json字符串中属性名为a 
      

      image-20220922150121672

    • JSON_CONTAINS_PATH(json_doc,one_or_all,path[,path])

      返回 0 或 1 以指示 JSON 文档是否包含给定路径或路径中的键名;

      如果文档中不存在指定的路径,则返回值为 0。否则,返回值取决于 one_or_all参数:

      • 'one': 如果文档中至少存在一个路径,则为 1,否则为 0。
      • 'all': 如果所有路径都存在于文档中,则为 1,否则为 0。
      SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
      SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e'); -- 查询Json字符串中是否存在属性名为a或e
      SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e'); -- 查询Json字符串中是否存在属性名为a和e同时存在
      

      image-20220922151751782

      image-20220922151717102

    • JSON_EXTRACT(json_doc,path[,path])

      从 JSON 字符串中返回数据,从与path 参数匹配的json字符串中key的值

      SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');-- 如果json字符串数组的话,$[1]表示json字符数组中的第2个元素的值
      SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]'); -- 返回结果:[20,10]
      SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]');-- 返回结果 :[30,40]
      

      image-20220922152534527

      mysql支持使用->运算符作为此函数的简写,其中是左侧是json字符串所在列的字段名,右侧是要在json字符串中匹配的json路径,即json字符串中的属性名

      • column->path

        -- 查询表中data字段中json字符串数组第一个对象的id属性的值
        SELECT a.`data`->'$[0].id' as id from wssl_order_info_b a;
        -- > 等价于
        SELECT JSON_EXTRACT(a.`data`, '$[0].id') as id FROM wssl_order_info_b a LIMIT 1;
        

        查询结果:

        image-20220922154421909 image-20220922155057678

        //表wssl_order_info_b中data字段中存储的json字符串值
        [{"": "", "id": "1120280820040", "goodsPrn": "1120280820040", "org_sc_name": "", "sample_name": "西瓜", "sample_brand": "", "sample_status": "YPZT_DRK", "sample_quantity": "", "sample_manu_date": ""}]
        
      • column->>path

        这是一个改进的、不带引号的提取操作符。column->>path等价于JSON_UNQUOTE(JSON_EXTRACT(column,path))JSON_UNQUOTE(column->path)

        SELECT a.`data`->>'$[0].id' as id from wssl_order_info_b a LIMIT 1
        

        image-20220922155535394

    • JSON_OVERLAPS(json_doc1,json_doc2) 比较2个json字符串中,有任何共同的键值对或数组元素则返回true

    • JSON_SEARCH(json_doc,one_or_all,search_str)返回json字符串中属性值等于search_str的属性名(属性名的路径eg$.a或$[0]),如果不存在则返回Null

    • JSON_VALUE(json_doc,path)MySQL 8.0.21 中引入,根据属性名的路径查询json字符串中属性值

      image-20220922161414588

  • 修改Json值得函数

    • JSON_ARRAY_APPEN(Json_doc,path,val[,path,val])将值附加到 JSON 文档中指定数组的末尾并返回结果
    • JSON_ARRAY_INSERT(json_doc,path,val)将数据插入 JSON 文档并返回结果
    • JSON_Merge(json_doc1,json_doc2...)合并2个或多个json字符串
    • JSON_MERGE_PATH(json_doc1,json_doc2...)执行两个或多个 JSON 文档的 RFC 7396兼容合并并返回合并结果,而不保留具有重复键的成员

posted @ 2022-09-22 17:14  肖恩雷  阅读(2132)  评论(0编辑  收藏  举报