Mysql5.7 + 查询并解析json数据方法

前言

我们在实际开发中,有时候会遇到数据库存放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}

Mysql5.7 + 查询并解析json数据方法_第1张图片

 比较复杂吧?

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

我想取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

就能取到​​​​​​​​​​​​​​Mysql5.7 + 查询并解析json数据方法_第2张图片

 

 

 

 

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

简单,请往下看

获取数组

大家想一想,单层的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

Mysql5.7 + 查询并解析json数据方法_第3张图片

 

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

Mysql5.7 + 查询并解析json数据方法_第4张图片

好,我们继续

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

Mysql5.7 + 查询并解析json数据方法_第5张图片

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

Mysql5.7 + 查询并解析json数据方法_第6张图片

 

OK  结束!

 

 

 

你可能感兴趣的:(mysql,sql,mysql,JSON_EXTRACT)