很多时候,我们需要在sql里面直接解析json字符串。这里针对mysql5.7版本的分水岭进行区分。

1.对于mysql5.7以上版本

使用mysql的内置函数JSON_EXTRACT(column, '$.key'),这个函数有两个参数,第一个参数column代表json列的列名;第二个参数key代表json字符串中的某一个key。

SELECT JSON_EXTRACT('{"priceTag":"员工/合作关键人","priceDiscount":"90"}', '$.priceDiscount') AS '定价折扣';

对于简单的json字符串肯定是可以解析成功,但是对于嵌套数组的没试过。

2.对于mysql5.7以下版本

只能充分发挥已有函数的功能去截取实现,无论实现方式是存储过程还是简单的sql语句,其原理都是一样的。

第一步,将所有的花括号的闭括号'}'替换成英文逗号',';第二步,获取key的坐标keyIndex和长度keyLength;第三步,获取以key为起点,第一个英文逗号','的坐标symbolIndex;第四步,使用substring截取字符串SUBSTRING(targetJsonStr, keyIndex + keyLength, symbolIndex - keyIndex - keyLength);第五步,使用replace将双引号'"'替换成空字符串'',完工。

示例:从{"priceTag": "员工/合作关键人","priceDiscount": "90"}中获取priceDiscount的值。

SELECT
REPLACE(
-- SUBSTRING(s,n,len)
-- 带有 len 参数的格式,从字符串 s 返回一个长度同 len 字符相同的子字符串,起始于位置 n。
SUBSTRING(
REPLACE(
'{"priceTag":"员工/合作关键人","priceDiscount":"90"}' ,
'}' ,
','
) , -- s 将初始字段中的有括号替换成','号
       -- LOCATE(substr,str)
-- 返回字符串substr在字符串str中第一次出现的位置从1开始计数 。
LOCATE(
'priceDiscount":' ,
REPLACE(
'{"priceTag":"员工/合作关键人","priceDiscount":"90"}' ,
'}' ,
','
)
) + CHAR_LENGTH('priceDiscount":') ,-- n 起始位置
LOCATE(
',' ,
REPLACE(
'{"priceTag":"员工/合作关键人","priceDiscount":"90"}' ,
'}' ,
','
) ,
LOCATE(
'priceDiscount":' ,
REPLACE(
'{"priceTag":"员工/合作关键人","priceDiscount":"90"}' ,
'}' ,
','
)
) + CHAR_LENGTH('priceDiscount":') -- n后的第一个','号在 s 中所在的位置
) -(
LOCATE(
'priceDiscount":' ,
REPLACE(
'{"priceTag":"员工/合作关键人","priceDiscount":"90"}' ,
'}' ,
','
)
) + CHAR_LENGTH('priceDiscount":')
) -- 计算出了key值对应的value值的长度
) ,
'"' ,
''
) AS '定价折扣'; 

文字描述:

1.先将原始字符串的右'}' 替换成 ','

2.计算出key值在步骤1中的位置,当做字段截取的起始位置

3.计算出key值右边最近的一个','号在步骤1中的位置  - 步骤2的位置 = key值对应的value值即字段截取长度

4.截取value值两边的双引号,即得出value值

参考:https://www.jianshu.com/p/513acedf436d

     https://blog.csdn.net/helloxiaozhe/article/details/86571387

相关函数介绍

LOCATE函数

语法 一:

LOCATE(substr,str)

返回字符串substr在字符串str中第一次出现的位置从1开始计数 。

如:

SELECT LOCATE("a","abca")

查询结果:

语法二:

LOCATE(substr,str,pos)

返回字符串substr从pos往后数在字符串str中第一次出现的位置从1开始计数 。

如:

SELECT LOCATE("a","abca",2)  

查询结果:

注:如果str、substr中任意一个字段为null则查询结果为null

  如果substr在str中不存在则返回0

SUBSTRING函数

MYSQL中获取子串函数 SUBSTRING(s,n,len) 带有 len 参数的格式,从字符串 s 返回一个长度同 len 字符相同的子字符串,起始于位置 n。

也可能对 n 使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的第 n 个字符,即倒数第 n 个字符,而不是字符串的开头位置。

参考:http://c.biancheng.net/mysql/substring.html

CHAR_LENGTH函数

返回函数内字符串的长度

如:

CHAR_LENGTH('priceDiscount":')

查询结果: 

踩坑背景:公司使用了MongoDB数据库存放数据,但是我所做的通用统计服务数据又存放在mysql内,所以需要MongoDB的数据往mysql导入,如果是简单的数据倒是没啥,但是这个json数据就有点难搞了。

比如上面的例子:他的key值是固定的,顺序可能也一致。MongoDB里面的数据就不一样了

举几个例子:

{"lightspot":"问题解决效率高","scotoma":"1.未查客户逾期情况2.未核实客户身份"}

{"scotoma":"未咨询汇款人"}

{"lightspot":"核实客户身份;问题处理快"}

{"scotoma":"后台操作不应说出(我看下是哪个客户)","lightspot":"1.规范用语2.问题解决思路清晰"}

顺序不一致,key值不一定全

SELECT
REPLACE(
substr(
REPLACE(ifnull(`b`.`comment`, ''),'}', ','), -- 原始字段
locate('scotoma":', REPLACE(ifnull(`b`.`comment`, ''), '}', ','))+ char_length('scotoma":'), -- 起始位置
IF(locate('scotoma":',
REPLACE(ifnull(`b`.`comment`, ''),
'}',
',')
) <> 0, -- 判定key值是否存在
locate(',',
REPLACE(ifnull(`b`.`comment`, ''), '}', ','),
locate('scotoma":', REPLACE(ifnull(`b`.`comment`, ''), '}', ','))
+ char_length('scotoma":')
) - (locate('scotoma":', REPLACE(ifnull(`b`.`comment`, ''), '}', ',')) + char_length('scotoma":')) -- 有就正常取值获取取值长度
, 0) -- 没有就取长度0
), -- 获取value内容
'"',
''
)
FROM ctr_new_db.cti_quality_judgement b

注:如果要运行我的这段sql只需要将sql中的`b`.`comment`替换成我上面举例的四个字符串中的任意一个即可

文字描述:

1.先将原始字符串的右'}' 替换成 ','

2.计算出key值在步骤1中的位置,当做字段截取的起始位置

3.判定key值在这个json中是否存在,存在则按照之前的计算逻辑获取value值的大小,不存在则取0

4.截取value值两边的双引号,即得出value值

mysql解析json字符串相关问题的更多相关文章

  1. Mysql解析json字符串/数组

    1 Mysql解析json字符串  解决方法:JSON_EXTRACT(原字段,'$.json字段名') 执行SQL: SELECT JSON_EXTRACT( t.result,'$.row'), ...

  2. 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址

    在线聊天项目结构图: 多用户登陆效果图: 多用户聊天效果图: 数据库效果图: 重新构建了Server类,使用了Gson方法,通过解析Json字符串,增加Info类,简化判断过程. Server类代码如 ...

  3. c# 自定义解析JSON字符串数据

    解析json字符串有很多方式, 1 : 在网上下载json解析的dll类库并添加引用, 调用相关方法; 2 : 使用自带类库JavaScriptSerializer的序列号和反序列化; 对于以上两个方 ...

  4. Scala中使用fastJson 解析json字符串

    Scala中使用fastJson 解析json字符串 添加依赖 2.解析json字符 2.1可以通过JSON中的parseObject方法,把json字符转转换为一个JSONObject对象 2.2然 ...

  5. 使用 dynamic 标记解析JSON字符串 JDynamic :支持Json反序列化为Dynamic对象

    使用 dynamic 标记解析JSON字符串  http://www.cnblogs.com/taotaodetuer/p/4171327.html 1 string jsonStr = " ...

  6. json解析json字符串时候,数组必须对应jsonObjectArray,不能对应JsonObject。否则会解析错误。

    json第三方解析json字符串时候,json数组必须对应jsonObjectArray,不能对应JsonObject.->只要是[]开头的都是json数组字符串,就要用jsonArray解析 ...

  7. C#解析JSON字符串总结

    JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...

  8. Json转model对象,model转json,解析json字符串

    GitHub链接: https://github.com/mozhenhau/D3Json D3Json 通过swift的反射特性,把json数据转换为model对象,本类最主要是解决了其他一般jso ...

  9. 解析Json字符串的三种方法

    在很多时候,我们的需要将类似 json 格式的字符串数据转为json, 下面将介绍日常中使用的三种解析json字符串的方法 1.首先,我们先看一下什么是 json 格式字符串数据,很简单,就是 jso ...

随机推荐

  1. 没有找到<context:component-scan base-package="">标签

    <?xml version="1.0" encoding="UTF-8"?> <!-- 指定Spring配置文件的Schema信息 --> ...

  2. Python实战之网上银行及购物商城

    前言:这是初学时写的小项目,觉得有意思就写来玩玩,也当是巩固刚学习的知识.现在看来很不成熟,但还是记录一下做个纪念好了~ 1.名称:网上网上银行及购物商城 2.项目结构: 当时刚接触python啦,哪 ...

  3. JSP学习(5)

    JSP学习(5) 保存用户状态的两大机制 session对象 Cookie Cookie简介 是Web服务器保存在客户端的一系列文本信息 典型应用 判断注册用户是否已经登录 购物车处理 作用 对特定对 ...

  4. union 横向组合

    select sum(zs) zs,sum(zl) zl,sum(ts) ts,sum(lxcbw) lxcbw,sum(bz) bz,sum(sfzqt) sfzqtfrom (select cou ...

  5. ShellExecute指定IE浏览器打开

    ShellExecute(NULL,L"open", L"iexplore.exe", L"www.baidu.com", NULL, SW ...

  6. shell 数组中 @ 跟 * 的区别

    关于在shell脚本中数组变量中 “*”跟 “@” 区别 “*”当变量加上“” 会当成一串字符串处理. “@”变量加上“” 依然当做数组处理. 在没有加上“” 的情况下 效果是等效的. #!/bin/ ...

  7. css3 first-of-type选择器以及css3选择器中:first-child与:first-of-type的区别

    CSS3 first-of-type选择器 “:first-of-type”选择器类似于“:first-child”选择器,不同之处就是指定了元素的类型,其主要用来定位一个父元素下的某个类型的第一个子 ...

  8. randomForest R 学习笔记

    object type randomForest 会根据变量的类型来决定regression或classification.class(iris$Species)是 factor,所以是classif ...

  9. dubbo、web应用 项目结构以及发布目录结构

    一.dubbo服务项目结构及发布结构 dubbo 服务项目结构 xxxxx-api 接口类和一些DTO 用于供其他项目依赖 需要提供dubbo服务的接口命名 以Facade结尾 (xxxxxFacad ...

  10. dede织梦5.7上传图片302以及Error #2038问题解决

    dede织梦5.7上传图片302以及Error #2038问题解决 三月 19, 2012 · Posted in DEDE二次开发, PHP  Number of View: 1388 在后台图片集 ...