您现在的位置是:群英 > 开发技术 > web开发
MySql如何查询JSON字段值的指定key的数据
Admin发表于 2022-05-17 17:55:263295 次浏览
在实际案例的操作过程中,我们可能会遇到“MySql如何查询JSON字段值的指定key的数据”这样的问题,那么我们该如何处理和解决这样的情况呢?这篇小编就给大家总结了一些方法,具有一定的借鉴价值,希望对大家有所帮助,接下来就让小编带领大家一起了解看看吧。


前言

昨天上线后通过系统报警发现了一个bug,于是紧急进行了回滚操作,但是期间有用户下单,数据产生了影响,因此需要排查影响了哪些订单,并对数据进行修复。

1. 问题现象

由于bug导致了订单表的customer_extra_info字段的hasfreightinsurance误更新成了“是”,因此需要查询回滚前一共有多少被误更新为“是”的订单,如下图:

于是查看订单表中customer_extra_info字段类型发现是json类型的

2. 解决方案

查询资料发现mysql5.7以后提供了一种新的字段格式-json。

对json类型的数据mysql提供了相关的查询操作。

先给出查询sql,后面在介绍mysql对json类型字段的查询操作

select
	* 
from
	( select id, customer_extra_info -> '$.hasfreightinsurance' as insurance from oms_order_list where project_id = 1 and update_time > '2022-04-15 16:30:17' ) t 
where
	json_contains ( insurance, json_object ( "value", "是" ) )

3. json数据查询

3.1 一般基础查询操作

1、使用 json字段名->’$.json属性’ 进行查询条件

select
	id,
	customer_extra_info
from
	oms_order_list 
where
	project_id = 1 
	and update_time > '2022-04-15 16:30:17'
	and customer_extra_info -> '$.maxclaimamount'=10

查询结果如下:

 2、关联表查询

json字段也支持关联表的查询,这里只写出使用方法,不做实例展示。其中deptleaderid和id分别是dept,dept_leader两个表中的关联字段。

select * from dept,dept_leader where dept.json_value->'$.deptleaderid'=dept_leader.json_value->'$.id' ;

3.2 一般函数查询操作

写到这里大家都发现了,我们查询的json都是整条json数据,这样看起来不是很方便,那么如果我们只想看json中的某个字段怎么办?

这样就引入了我们的第一个函数:json_extract(字段名,json字段名)

在详细介绍用法之前我们可以看看官网的函数介绍:

 咱们可以看到官网介绍json_extract()这个函数很详细:return data from json document

从json中返回字段

1、函数 json_extract():从json中返回想要的字段

用法:json_extract(字段名,$.json字段名)
实例:

select
	id,
	json_extract ( customer_extra_info, '$.hasfreightinsurance' ) as hasfreightinsurance 
from
	oms_order_list 
where
	project_id = 1 
	and update_time > '2022-04-15 16:30:17'

查询结果如下:

2、函数json_contains():json格式数据是否在字段中包含特定对象 

用法: json_contains(target, candidate[, path])
实例:

select
	id,
	customer_extra_info 
from
	oms_order_list 
where
	project_id = 1 
	and update_time > '2022-04-15 16:30:17' 
	and json_contains ( customer_extra_info, json_object ( "maxclaimamount", 10 ) )

查询结果如下:

3、函数json_object():将一个键值对列表转换成json对象 

比如我们想查询某个对象里面的值等于多少

我们可以看到hasfreightinsurance中还有一个对象,里面还有name和value两个属性字段,那么我们应该怎么查询value=否的订单呢。

用法:json_object([key, val[, key, val] …])
实例:

select
	* 
from
	( select id, customer_extra_info -> '$.hasfreightinsurance' as insurance from oms_order_list where project_id = 1 and update_time > '2022-04-15 16:30:17' ) t 
where
	json_contains ( insurance, json_object ( "value", "否" ) )

查询结果如下:

4、函数json_array():创建json数组

​用法:json_array([val[, val] …])

实例:我们要查询deptname包含1的数据

select
	id,
	customer_extra_info 
from
	oms_order_list 
where
	project_id = 1 
	and update_time > '2022-04-15 16:30:17' 
	and json_contains ( customer_extra_info -> '$.deptname', json_array ( "1" ) )

查询结果如下:

5、函数json_type():查询某个json字段属性类型

用法:json_type(json_val)
事例:比如我们想查询deptname的字段属性是什么

select
	id,
	customer_extra_info -> '$.deptname',
	json_type ( customer_extra_info -> '$.deptname' ),
	customer_extra_info -> '$.hasfreightinsurance',
	json_type ( customer_extra_info -> '$.hasfreightinsurance' ) 
from
	oms_order_list 
where
	project_id = 1 
	and update_time > '2022-04-15 16:30:17'

查询结果如下:

6、函数json_extract() :从json文档返回数据 

这也是我们开发中会经常用到的一个函数

select
	* 
from
	oms_order_list 
where
	project_id = 1 
	and update_time > '2022-04-15 16:30:17' 
	and json_contains ( json_extract ( customer_extra_info, '$.hasfreightinsurance' ), json_object ( "value", "否" ) )

 查询结果如下:

7、函数json_keys() :json文档中的键数组

 用法:json_keys(json_value)

实例:比如我们想查询json格式数据中的所有key

select
	id,
	json_keys ( customer_extra_info ) 
from
	oms_order_list 
where
	project_id = 1 
	and update_time > '2022-04-15 16:30:17'

 查询结果如下:

4. json数据新增更新删除

接下来的3种函数都是新增数据类型的:
json_set(json_doc, path, val[, path, val] …)
json_insert(json_doc, path, val[, path, val] …)
json_replace(json_doc, path, val[, path, val] …)

1、函数json_set() :将数据插入json格式中,有key则替换,无key则新增
这也是我们开发过程中经常会用到的一个函数

用法:json_set(json_doc, path, val[, path, val] …)

实例:比如我们想针对id=2的数据新增一组:newdata:新增的数据,修改deptname为新增的部门1
sql语句如下:

update dept set json_value=json_set('{"deptname": "部门2", "deptid": "2", "deptleaderid": "4"}','$.deptname','新增的部门1','$.newdata','新增的数据') where id=2;
 
select * from dept where id =2

结果:

注意:json_doc如果不带这个单元格之前的值,之前的值是会被新值覆盖的,比如我们如果更新的语句换成:

update dept set json_value=json_set('{"a":"1","b":"2"}','$.deptname','新增的部门1','$.newdata','新增的数据') where id=2

我们可以看到这里json_doc是{“a”:“1”,“b”:“2”},这样的话会把之前的单元格值覆盖后再新增/覆盖这个单元格字段

结果:

2、函数json_insert():插入值(往json中插入新值,但不替换已经存在的旧值)
用法:json_insert(json_doc, path, val[, path, val] …)

 实例:

update dept set json_value=json_insert('{"a": "1", "b": "2"}', '$.deptname', '新增的部门2','$.newdata2','新增的数据2') 
where id=2

结果:

 我们可以看到由于json_doc变化将之前的值覆盖了,新增了deptname和newdata2.
如果我们再执行以下刚才的那个sql,只是换了value,我们会看到里面的key值不会发生变化。
因为这个函数只负责往json中插入新值,但不替换已经存在的旧值。

3、函数json_replace()
用法:json_replace(json_doc, path, val[, path, val] …)

用例:
如果我们要更新id=2数据中newdata2的值为:更新的数据2

sql语句如下:

update dept set json_value=json_replace('{"a": "1", "b": "2", "deptname": "新增的部门2", "newdata2": "新增的数据2"}', '$.newdata2', '更新的数据2') where id =2;
 
select * from dept where id =2

结果:

4、函数json_remove() :从json文档中删除数据
用法:json_remove(json_doc, path[, path] …)

举例:删除key为a的字段。

update dept set json_value=json_remove('{"a": "1", "b": "2", "deptname": "新增的部门2", "newdata2": "更新的数据2"}','$.a') where id =2;

结果:

5、函数json_search() :用于在json格式中查询并返回符合条件的节点
这是一个非常强大的函数



以上就是关于“MySql如何查询JSON字段值的指定key的数据”的介绍了,感谢各位的阅读,希望文本对大家有所帮助。如果想要了解更多知识,欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-04-28 17:27:33 
摘要:这篇文章主要介绍了C++结构体与类的区别,C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。下面我们一起进入文章俩姐具体内容,需要的朋友也可以参考一下
2022-07-23 17:46:54 
摘要:本篇文章给大家介绍《解析PHP8底层内核源码-数组(三)》。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
2022-06-06 17:11:13 
摘要:go语言实现顺序生成数字的方法:首先创建一个go代码示例文件;然后自定义一个makeRange方法;最后通过“for i := range a {a[i] = min + i}”方法顺序生成数字即可。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部