mysql解析json字符串相关问题
很多时候,我们需要在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字符串相关问题的更多相关文章
- Mysql解析json字符串/数组
1 Mysql解析json字符串 解决方法:JSON_EXTRACT(原字段,'$.json字段名') 执行SQL: SELECT JSON_EXTRACT( t.result,'$.row'), ...
- 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址
在线聊天项目结构图: 多用户登陆效果图: 多用户聊天效果图: 数据库效果图: 重新构建了Server类,使用了Gson方法,通过解析Json字符串,增加Info类,简化判断过程. Server类代码如 ...
- c# 自定义解析JSON字符串数据
解析json字符串有很多方式, 1 : 在网上下载json解析的dll类库并添加引用, 调用相关方法; 2 : 使用自带类库JavaScriptSerializer的序列号和反序列化; 对于以上两个方 ...
- Scala中使用fastJson 解析json字符串
Scala中使用fastJson 解析json字符串 添加依赖 2.解析json字符 2.1可以通过JSON中的parseObject方法,把json字符转转换为一个JSONObject对象 2.2然 ...
- 使用 dynamic 标记解析JSON字符串 JDynamic :支持Json反序列化为Dynamic对象
使用 dynamic 标记解析JSON字符串 http://www.cnblogs.com/taotaodetuer/p/4171327.html 1 string jsonStr = " ...
- json解析json字符串时候,数组必须对应jsonObjectArray,不能对应JsonObject。否则会解析错误。
json第三方解析json字符串时候,json数组必须对应jsonObjectArray,不能对应JsonObject.->只要是[]开头的都是json数组字符串,就要用jsonArray解析 ...
- C#解析JSON字符串总结
JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...
- Json转model对象,model转json,解析json字符串
GitHub链接: https://github.com/mozhenhau/D3Json D3Json 通过swift的反射特性,把json数据转换为model对象,本类最主要是解决了其他一般jso ...
- 解析Json字符串的三种方法
在很多时候,我们的需要将类似 json 格式的字符串数据转为json, 下面将介绍日常中使用的三种解析json字符串的方法 1.首先,我们先看一下什么是 json 格式字符串数据,很简单,就是 jso ...
随机推荐
- python学习笔记(7)文件的访问与函数式编程
一.文件读写的3中方法 1.直接读入 fiel1=open('test.txt') file2=open('output.txt') while True: line=file1.readLine() ...
- nginx入门(一)
什么是nginx? nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5 ...
- HTML文件头部元素作用
1.DOCTYPE的作用 DOCTYPE是document type(文档类型)的缩写.<!DOCTYPE html>声明位于文档最前面,主要作用是告诉浏览器的解析器使用哪种HTML规范或 ...
- sqoop简单使用
一,通过sqoop将MySQL里面的数据加载到HDFS 先查看有哪些数据库 查看表person sqoop list-databases --connect jdbc:mysql://ly-p2p4: ...
- 百度地图api 实例 自动提示 并计算两地的行驶距离
百度地图api 实例 自动提示 并计算两地的行驶距离 <!DOCTYPE html> <html> <head> <meta http-equiv=" ...
- WPF绑定各种数据源之xml数据源
一.WPF绑定各种数据源索引 WPF 绑定各种数据源之Datatable WPF绑定各种数据源之object数据源 WPF绑定各种数据源之xml数据源 WPF绑定各种数据源之元素控件属性 Bindin ...
- Python在windows下编译成exe文件
1. pip install pyinstaller 2. 在Terminal下输入:“pyinstaller -F -w *.py” 就可以生成exe.生成的文件放在同目录dist下. -F(注意 ...
- jvm监控和诊断工具
大牛写的Java的OOM Killer:https://www.jianshu.com/p/4645254be259 强烈推荐 总的参考链接:https://cloud.tencent.com/dev ...
- 求助:关于shell数值比较的错误提示
今天写了个脚本,过不了错误这一关,求大神路过瞟一眼. 1 #!/bin/bash 2 #disk use 3 disk_use() { 4 DISK_LOG=/tmp/disk_use.tmp 5 D ...
- Sql server 启用调试
在SQL Server 2008管理平台上,调试2005的数据库,会报错. 用 SQL Server 2008管理平台,调试本机数据库,当登录服务器名为“.”的时候也会报错. 解决方法,暂时使用S ...