相关文章推荐
跑龙套的单杠  ·  分享6个对象数组去重的方法开发者社区·  2 月前    · 
打盹的板栗  ·  前端传递JSON数组数据到后端(解析方法)_ ...·  2 月前    · 
暴走的长颈鹿  ·  堆快照文件格式 - Microsoft ...·  1 月前    · 
失落的咖啡豆  ·  JSON函数语法功能详解与示例-日志服务-阿里云·  2 天前    · 
重情义的单杠  ·  Python中如何快速解析JSON对象数组 ...·  2 天前    · 
精明的小马驹  ·  drf实现用户的登录注册功能 - CSDN文库·  1 年前    · 
道上混的鸡蛋  ·  谁是rabbitmq集群管理员?我怎样才能从 ...·  2 年前    · 
骑白马的毛豆  ·  归因分析--增长分析-火山引擎·  2 年前    · 
细心的茶叶  ·  java.lang.ClassCastExc ...·  2 年前    · 
光明磊落的围巾  ·  Python pandas - 知乎·  2 年前    · 
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 及以上版本。如果你使用的是更早的版本,可能需要使用其他方法来实现。
 
推荐文章
跑龙套的单杠  ·  分享6个对象数组去重的方法开发者社区
2 月前
打盹的板栗  ·  前端传递JSON数组数据到后端(解析方法)_element-china-area-data 前端json数组怎么转换成字符串传到后端
2 月前
暴走的长颈鹿  ·  堆快照文件格式 - Microsoft Edge Developer documentation | Microsoft Learn
1 月前
失落的咖啡豆  ·  JSON函数语法功能详解与示例-日志服务-阿里云
2 天前
重情义的单杠  ·  Python中如何快速解析JSON对象数组 - 小小程序员ol
2 天前
精明的小马驹  ·  drf实现用户的登录注册功能 - CSDN文库
1 年前
道上混的鸡蛋  ·  谁是rabbitmq集群管理员?我怎样才能从集群中获得数据?
2 年前
骑白马的毛豆  ·  归因分析--增长分析-火山引擎
2 年前
细心的茶叶  ·  java.lang.ClassCastException:java.lang.ClassCastException: android.view.AbsSavedState$1..解决方法__GD的博客-CSDN博客
2 年前
光明磊落的围巾  ·  Python pandas - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号