• 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}

     比较复杂吧?

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

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

    1. SELECT
    2. JSON_EXTRACT(
    3. '{"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}',
    4. '$.ladderConfig'
    5. )
    6. FROM
    7. DUAL

    就能取到

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

    简单,请往下看

    获取数组

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

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

    1. SELECT
    2. JSON_EXTRACT(
    3. JSON_EXTRACT(
    4. '{"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}',
    5. '$.ladderConfig'
    6. ),'$[0]')
    7. FROM
    8. DUAL

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

    好,我们继续

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

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

    OK  结束!

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

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

  • 相关阅读:
    微服务全链路灰度新能力
    天池Python练习05-列表操作
    常用设计模式
    姓氏起源查询易语言代码
    826. 单链表
    通讯录实现之进阶版将通讯录数据保存在文件中(完整代码)
    11+单基因泛癌,转录组+单细胞+机器学习+预后模型
    (matplotlib)如何让各个子图ax大小(宽度和高度)相等
    【力扣每日一题】2023.9.11 课程表Ⅲ
    docker服务无法关停的原因
  • 原文地址:https://blog.csdn.net/qq_35086097/article/details/126667641