相关文章推荐
体贴的匕首  ·  objective-c和java下解析对象类 ...·  2 月前    · 
冲动的登山鞋  ·  【Qt之JSON文件】QJsonDocume ...·  2 周前    · 
强健的沙发  ·  BoundingBox class | ...·  2 周前    · 
个性的单杠  ·  java ...·  2 周前    · 
求醉的剪刀  ·  arm_cfft_f32怎么用 - CSDN文库·  9 月前    · 
酷酷的蜡烛  ·  Microsoft App store ...·  1 年前    · 
文雅的数据线  ·  字符串连接与合并_fortran字符串拼接函 ...·  1 年前    · 
痴情的铁链  ·  Java sort()数组排序(升序和降序)·  1 年前    · 
逼格高的蛋挞  ·  【mySQL】C++操作mySql数据库(M ...·  2 年前    · 
Code  ›  Mysql JSON对象和JSON数组查询_mysql json数组
mysql select mysql数据库 对象数组
https://blog.csdn.net/qq_38983728/article/details/126144608
爱听歌的猴子
6 月前
      • 1. 函数说明
      • 2. JSON对象
      • 3. 字符串JSON数组
          • 3.1 AND关系
          • 3.2 OR关系
        • 4. 对象数组
        • 5. 集成 Mybatis plus
        • 6. 模糊查询
        • 7. json_table
            • 7.1 分组计算总数
            • 7.2 对象去重
          • 8. JSONArray查询
              • 8.1 模糊查询
              • 8.2 等值匹配
              • 8.3 时间搜索
              • 8.4 在列表
              • 8.5 包含
            • 9. 索引

            1. 函数说明

            JSON_CONTAINS(json_doc, val[, path]) :判断是否包含某个json值

            JSON_ARRAY([val[, val] ...]) :创建json数组

            2. JSON对象

            {"key": 1, "name": "万飞"}
            
            SELECT * FROM `ak_file_config` where file_type -> '$.name' = "万飞"
            

            3. 字符串JSON数组

            3.1 AND关系
            ["EXE", "白加黑", "DLL"]
            
            SELECT * FROM `ak_file_config` where JSON_CONTAINS(file_type, JSON_ARRAY("白加黑","DLL"))
            
            3.2 OR关系
            SELECT * FROM `ak_file_config` where JSON_CONTAINS(file_type,'"DLL"') OR JSON_CONTAINS(file_type,'"EXE"')
            

            4. 对象数组

            参考 https://wenku.baidu.com/view/0831b7cc6194dd88d0d233d4b14e852459fb3958?aggId=0831b7cc6194dd88d0d233d4b14e852459fb3958

            5. 集成 Mybatis plus

            // jsonArray查询
            .apply(CollUtil.isNotEmpty(query.getFileType()), StrUtil.format("JSON_CONTAINS(t.file_type, JSON_ARRAY({}))",
                            // 设置占位符{0},{1},{2}
                            IntStream.range(0, Optional.ofNullable(query.getFileType()).orElse(Collections.emptyList()).size())
                                    .mapToObj(i -> "{".concat(String.valueOf(i)).concat("}"))
                                    .collect(Collectors.joining(","))),
                    Optional.ofNullable(query.getFileType()).orElse(Collections.emptyList()).toArray())
            

            参考 https://blog.csdn.net/qq_31832209/article/details/125374325

            6. 模糊查询

            SELECT
            	`ak_file_config` 
            WHERE
            	JSON_EXTRACT(file_type, '$' ) LIKE '%DL%';
            

            在这里插入图片描述
            代码里参考

            String productOrCompanyName = query.getProductOrCompanyName().replace("\"", "_");
            .and(StrUtil.isNotBlank(productOrCompanyName),
                                    wq -> wq.apply("JSON_EXTRACT(LOWER(t.label_involve_product), '$') LIKE LOWER(CONCAT('%', {0}, '%'))", productOrCompanyName)
                                            .or()
                                            .apply("JSON_EXTRACT(LOWER(t.label_involve_company), '$') LIKE LOWER(CONCAT('%', {0}, '%'))", productOrCompanyName))
             

            如果输入字符串带双引号,需要将\"替换成_进行模糊搜索,但是会查询出不带双引号的数据

            7. json_table

            mysql最低版本8.0.4

            7.1 分组计算总数
            SELECT
            	JSON_TABLE ( '["11", "22"]', '$[*]' COLUMNS ( NESTED PATH '$' COLUMNS ( result INT PATH '$' ) ) ) AS t;
            

            在这里插入图片描述
            json对象数组参考
            https://cdn.modb.pro/db/484630

            在表中关联字符串数组分组查询
            在这里插入图片描述
            需求:统计各类型的数量

            SELECT
            	t1.result,
            	count( t1.result ) AS count 
            	pe_main_body t
            	INNER JOIN JSON_TABLE ( t.overview_product_type, '$[*]' COLUMNS ( NESTED PATH '$' COLUMNS ( result VARCHAR ( 100 ) PATH '$' ) ) ) AS t1 
            WHERE
            	del_flag = FALSE 
            GROUP BY
            	t1.result
            
            7.2 对象去重

            在这里插入图片描述
            例如:match_context字段是对象数组,对象里面有两个字段keyWord和describe

            需求:查询出所有的不重复的对象

            SELECT DISTINCT
            	t1.result 
            	ii_sensitive_resource_info t
            	INNER JOIN JSON_TABLE ( t.match_context, '$[*]' COLUMNS ( NESTED PATH '$' COLUMNS ( result JSON PATH '$' ) ) ) AS t1 
            WHERE
            	company_id IN ( 296 )
             

            DISTINCT:去重

            在这里插入图片描述
            改为字段返回

            SELECT
            	result ->> '$.keyWord' AS keyWord,
            	result ->> '$.describe' AS descInfo 
            	SELECT DISTINCT
            		t1.result 
            		ii_sensitive_resource_info t
            		INNER JOIN JSON_TABLE ( t.match_context, '$[*]' COLUMNS ( NESTED PATH '$' COLUMNS ( result JSON PATH '$' ) ) ) AS t1 
            WHERE
            	company_id IN ( 296 )) tmp
             

            ->>:会去除双引号

            8. JSONArray查询

            • JSONArray 符号是$[*],$[0]是数组对象时,不能查询所有,老版本不支持$[*],使用新版本
            • JSONObject 符号是 $
            8.1 模糊查询
            SELECT * FROM `tf_cloud`.`tf_low_data_testUser` WHERE  `address`->'$[*].name' LIKE "%bbb%"
            
            8.2 等值匹配
            SELECT * FROM `tf_cloud`.`tf_low_data_testUser` WHERE  JSON_CONTAINS(address->"$[*].name", '"cccaa"');
             

            如果是数字,外面也需要使用'包起来,'121'

            也可以指定下标查询,但是不能使用$[*]

            SELECT * FROM `tf_cloud`.`tf_low_data_testUser` WHERE  `address`->'$[0].name' = "bbb"
            
            8.3 时间搜索
            SELECT * FROM `tf_cloud`.`tf_low_data_testUser` WHERE CAST(JSON_UNQUOTE(`address`->'$[0].date') AS DATETIME) BETWEEN '2023-08-13' AND '2023-08-17'
            
            8.4 在列表
            SELECT * FROM `tf_cloud`.`tf_low_data_testUser` WHERE JSON_CONTAINS(address->"$[*].name", '"cccaa"') OR JSON_CONTAINS(address->"$[*].name", '"bbb"');
             

            列表有几个值就用几个OR拼接

            也可以指定下标查询,但是不能使用$[*]

            SELECT * FROM `tf_cloud`.`tf_low_data_testUser` WHERE  `address`->'$[0].name' IN ("bbb","ccc")
            
            8.5 包含
            SELECT * FROM `tf_cloud`.`tf_low_data_testUser` WHERE  json_contains(`address`->"$[*].nickname",'["bbb"]')
            

            9. 索引

            参考 https://blog.csdn.net/cainiao1412/article/details/132429231

            使用 字段->’$.json属性’ 进行查询条件 使用json_extract函数查询,json_extract(字段,"$.json属性") 根据json数组查询,用JSON_CONTAINS(字段,JSON_OBJECT(‘json属性’, “内容”)) MySQL5.7以上支持JSON的操作,以及增加了JSON存储类型 一般数据库存储j... 1. 对 JSON 值求和: 可以使用 JSON_EXTRACT 函数来获取 JSON 字段的值,然后使用 CAST 函数将其转换为数字类型,最后使用 SUM 函数对其进行求和。 示例代码: SELECT SUM(CAST(JSON_EXTRACT(json_column, '$.key') AS UNSIGNED)) FROM table_name; 其中,json_column 是包含 JSON 数据的列名,key 是 JSON 字段名。 2. 对 JSON 数组值求和: 可以使用 JSON_TABLE 函数将 JSON 数组转换为表格形式,然后使用 SUM 函数对表格中的列进行求和。 示例代码: SELECT SUM(value) FROM JSON_TABLE(json_array_column, '$[*]' COLUMNS(value INT PATH '$')) AS jt; 其中,json_array_column 是包含 JSON 数组的列名,value 是 JSON 数组中的值。 注意:以上代码仅适用于 MySQL 5.7 及以上版本。如果你使用的是更早的版本,可能需要使用其他方法来实现。
 
推荐文章
体贴的匕首  ·  objective-c和java下解析对象类型和数组类型JSON字符串 - 铭久
2 月前
冲动的登山鞋  ·  【Qt之JSON文件】QJsonDocument、QJsonObject、QJsonArray等类介绍及使用 - FBshark
2 周前
强健的沙发  ·  BoundingBox class | Microsoft Learn
2 周前
个性的单杠  ·  java string转对象数组_mob64ca12d32849的技术博客_
2 周前
求醉的剪刀  ·  arm_cfft_f32怎么用 - CSDN文库
9 月前
酷酷的蜡烛  ·  Microsoft App store won't launch on windows 10 pro - Microsoft Community
1 年前
文雅的数据线  ·  字符串连接与合并_fortran字符串拼接函数-CSDN博客
1 年前
痴情的铁链  ·  Java sort()数组排序(升序和降序)
1 年前
逼格高的蛋挞  ·  【mySQL】C++操作mySql数据库(Mysql connector c++)_51CTO博客_C++操作mysql
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号