前言

我们在实际开发中,有时候会遇到数据库存放json格式的数据,我们需要解析并且去计算求和等等操作,常规做法肯定是代码取出来然后循环遍历,一个一个解析。当然这没错,但是能不能通过sql语句直接查询并且解析呢? 

sure

Mysql5.7 之前是不能解析的,从5,7之后,Mysql提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。 在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。于是就有了一个函数----JSON_EXTRACT

话不多说直接上干货:

函数语法:JSON_EXTRACT(字段名,'$.json字段名')

例如:我库里存的是

{"ladder":true,"useFirstSurplusDosage":0.0,"useSecondSurplusDosage":0.0,"ladderConfig":[{"price":2800,"dosage":242.0,"increment":"60"}, {"price":3360,"dosage":1800.0,"increment":"60"}, {"price":4200}, {}, {}],"gasValue":34.0,"detail":[{"price":2800,"cur":0,"fee":95200,"dosage":34.0}],"fee":95200}

 比较复杂吧?

没关系 ,函数能帮我们解决!

我想取ladderConfig的内容(到时候把第一个参数换成字段,把dual换成实际的表):

SELECT
  JSON_EXTRACT(
    '{"ladder":true,"useFirstSurplusDosage":0.0,"useSecondSurplusDosage":0.0,"ladderConfig":[{"price":2800,"dosage":242.0,"increment":"60"}, {"price":3360,"dosage":1800.0,"increment":"60"}, {"price":4200}, {}, {}],"gasValue":34.0,"detail":[{"price":2800,"cur":0,"fee":95200,"dosage":34.0}],"fee":95200}',
    '$.ladderConfig'
  )
FROM
  DUAL

就能取到

好,有同学可能会问,这里面是个数组怎么弄啊 

简单,请往下看

获取数组

大家想一想,单层的json我们能获取到,那数组不就是多个单层嘛? OK 开始!

我要获取这个数组第一个元素,怎么搞,  没错 和代码一样!

SELECT
JSON_EXTRACT(
  JSON_EXTRACT(
    '{"ladder":true,"useFirstSurplusDosage":0.0,"useSecondSurplusDosage":0.0,"ladderConfig":[{"price":2800,"dosage":242.0,"increment":"60"}, {"price":3360,"dosage":1800.0,"increment":"60"}, {"price":4200}, {}, {}],"gasValue":34.0,"detail":[{"price":2800,"cur":0,"fee":95200,"dosage":34.0}],"fee":95200}',
    '$.ladderConfig'
  ),'$[0]')
FROM
  DUAL

没错 你没看错,多个单层不就套娃不就行了吗?

好,我们继续

那我想获取数组元素里面的某个属性值咋办? 看好了

 没错,加属性名啊,是不是傻?

OK  结束!

------------------------------  20230531   续篇来了----------------

Mysql5.7 + 查询并解析json数据方法(后转)

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:28 天前 )
960b763e 3 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐