相关文章推荐
失落的咖啡豆  ·  JSON函数语法功能详解与示例-日志服务-阿里云·  2 月前    · 
重情义的单杠  ·  Python中如何快速解析JSON对象数组 ...·  2 月前    · 
高大的蟠桃  ·  ACON Biotech ...·  4 月前    · 
无聊的生姜  ·  杭州市临安区区属国有企业2024年度招引高层 ...·  7 月前    · 
微醺的香烟  ·  正午阳光“解散”艺人 ...·  1 年前    · 
爱喝酒的篮球  ·  余华给孩子开了份名著分级书单,建议三年级就可 ...·  1 年前    · 
爱看球的伤疤  ·  from ...·  1 年前    · 
Code  ›  Mysql JSON对象和JSON数组查询_mysql json数组
mysql select mysql数据库 对象数组
https://blog.csdn.net/qq_38983728/article/details/126144608
爱听歌的猴子
1 年前
      • 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 及以上版本。如果你使用的是更早的版本,可能需要使用其他方法来实现。
 
推荐文章
失落的咖啡豆  ·  JSON函数语法功能详解与示例-日志服务-阿里云
2 月前
重情义的单杠  ·  Python中如何快速解析JSON对象数组 - 小小程序员ol
2 月前
高大的蟠桃  ·  ACON Biotech (Hangzhou) Co., Ltd.
4 月前
无聊的生姜  ·  杭州市临安区区属国有企业2024年度招引高层次紧缺专业人才公告
7 月前
微醺的香烟  ·  正午阳光“解散”艺人 “艺人经纪”这趟水有多深-中国新闻网
1 年前
爱喝酒的篮球  ·  余华给孩子开了份名著分级书单,建议三年级就可以读大仲马了
1 年前
爱看球的伤疤  ·  from pdfminer.pdfinterp import PDFResourceManager, process_pdf ImportError: cannot import name 'proc
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号