MySQL5.7中增加的JSON特性的处理方法JSON_EXTRACT和JSON_ARRAY_APPEND以及MYSQL中JSON操作的方法大全

一、MySQL5.7中增加的JSON特性的处理方法JSON_EXTRACT和JSON_ARRAY_APPEND

数据库中有些字段的存储可能是json字符串,在MYSQL5.7之前直接使用sql不好操作,但在mysql5.7中增加了对json处理的一些函数,比如JSON_EXTRACT分解JSON 并查询以及JSON_ARRAY_APPEND向已有的json字段中直接添加值,而不需要用程序取出来反json添加字段再序列化存入。

1.JSON_EXTRACT的使用:

如果要从库里只查出一长串json中的某个字段,可以直接使用JSON_EXTRACT进行提取。它可以直接分解JSON并查询,实际上就是在提供的path下查找值。JSON_EXTRACT可以通过键索引访问,也可以通过数字索引访问,示例如下:

sql 复制代码
#语法:
JSON_EXTRACT(json_doc, path[, path] ...)
#JSON_EXTRACT查询示例,解析整数索引的数组 
select  id,chars,JSON_EXTRACT(chars,"$[0]","$[1]","$[2]","$[1]") as charjson from test where id=2 ;
#查询得到的记录如下:
2|["test0","test1.","2test2."]|["test0", "test1.", "2test2.", "test1."]
#JSON_EXTRACT查询示例,解析键值对的对象 
select  id,chars,JSON_EXTRACT(chars,"$.name","$.mark") as charjson from test where id=3 ;
3|{"id":"12345","name":"04007.cn","mark":"test."}|["04007.cn", "test."]
可见JSON_EXTRACT对json操作的时候有两种方式提取,对于键值对的内容通过键名提取,对于索引的数组使用数字下标提取。新查询得到的内容是默认组成新的数组json。

2.JSON_ARRAY_APPEND的使用:

JSON_EXTRACT是从数据库中的json中提取目标值,而JSON_ARRAY_APPEND则是为实现查询的时候把数据添加进查询结果。

sql 复制代码
#语法:
JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
#JSON_ARRAY_APPEND查询示例
select  id,chars,JSON_ARRAY_APPEND(chars,'$[1]',"test3",'$[0]',"test4") as charjson from test where id=2 ;
#执行结果如下:
2 | ["test0","test1."]|[["test0", "test4"], ["test1.", "test3"]]
select  id,chars,JSON_ARRAY_APPEND(chars,'$.name',"hello") as charjson from test where id=3 ;
#执行结果如下:
3 | {"id":"12345","name":"04007.cn"} | {"id": "12345", "name": ["04007.cn", "hello"]}
#也可以执行对$进行操作
select  id,chars,JSON_ARRAY_APPEND(chars,'$',"hello") as charjson from test where id=3 ;
3 | {"id":"12345","name":"04007.cn"} | [{"id": "12345", "name": "04007.cn"}, "hello"]

3.文章评论

Level : 1. User:us20200117174931-934 Time:2020-03-05 20:45:50

感觉mysql的JSON类型就是一个鸡肋。

二、MYSQL中JSON操作的方法大全

#、创建json的方法:

  1. 创建JSON数组形式和JSON对象的数据

JSON_ARRAY([val[, val] ...])

JSON_OBJECT([key, val[, key, val] ...])

2.修改json的方法,在JSON数组后增加新的数据

JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)

JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)

3.合并JSON数据

JSON_MERGE(json_doc, json_doc[, json_doc] ...)

4.删除一部分JSON数据

JSON_REMOVE(json_doc, path[, path] ...)

5.替换一部分JSON数据

JSON_REPLACE(json_doc, path, val[, path, val] ...)

6.有存在的数据就替换,没有就插入

JSON_SET(json_doc, path, val[, path, val] ...)

#、查询json的方法

1.查找是否包含

JSON_CONTAINS(json_doc, val[, path])

2.查找path(就是key)是否存在

JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)

第二个参数one或者all表示是要全部满足还是只满足一个

mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';

3.分解JSON 并查询,实际上就是在提供的path下查找值

JSON_EXTRACT(json_doc, path[, path] ...)

JSON_EXTRACT 还可以使用一种替代语法 column->path直接查询json中的列,示例如下:

mysql> SELECT c, JSON_EXTRACT(c, ".id"), g FROM jemp WHERE c-\>".id" > 1 ORDER BY c->"$.name";

mysql> SELECT c, c->".id", g FROM jemp WHERE c-\>".id" > 1 ORDER BY c->"$.name";

4.提出当前提供path下的key值

JSON_KEYS(json_doc[, path])

5.按着提供的值去查询,返回path数组。one_or_all南

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])

#、查询JSON自有属性的方法

1.查询当前JSON深度

JSON_DEPTH(json_doc)

2.查询当前层级(path)下对象或者数组的元素数量

JSON_LENGTH(json_doc[, path])

3.返回JSON值类型

JSON_TYPE(json_val)

4.验证是否是JSON

JSON_VALID(val)

相关推荐
明月_清风13 小时前
你真的懂 JSON 吗?那些被忽略的底层边界与性能陷阱
前端·json
明月_清风13 小时前
大规模监控数据下的 JSON 优化:从 OOM 崩溃到极致吞吐的进阶之路
前端·json
JQLvopkk1 天前
JSON序列化与反序列化
json
键盘鼓手苏苏2 天前
Flutter for OpenHarmony 实战:Flutter Rust Bridge — 极致计算性能方案
开发语言·后端·flutter·华为·rust·json·harmonyos
攻城狮的梦2 天前
go中json数据的转化
json
Dxy12393102163 天前
Python检查JSON格式错误的多种方法
前端·python·json
秃了也弱了。3 天前
python修复json神器:json-repair包(用于大模型返回json不规范)
python·json
I'm Jie3 天前
【已解决】SqlAlchemy 插入 MySQL JSON 字段时 None 变为 ‘null‘ 字符串,WHERE IS NULL 失效
数据库·python·mysql·json·fastapi·sqlalchemy
Hui Baby4 天前
Spring Boot 中使用 JSONPath 高效处理 JSON 数据
spring boot·python·json
Hui Baby4 天前
SpringBoot + JSON 字段 + MySQL 8.0 函数索引:灵活存储半结构化数据,查询不慢
spring boot·mysql·json