详解Mysql中的JSON系列操作函数

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

一、方法罗列:

分类 函数 描述
创建json
json_array 创建json数组
json_object 创建json对象
json_quote 将json转成json字符串类型
查询json
json_contains 判断是否包含某个json值
json_contains_path 判断某个路径下是否包json值
json_extract 提取json值
column->path json_extract的简洁写法,MySQL 5.7.9开始支持
column->>path json_unquote(column -> path)的简洁写法
json_keys 提取json中的键值为json数组
json_search 按给定字符串关键字搜索json,返回匹配的路径
修改json
json_append 废弃,MySQL 5.7.9开始改名为json_array_append
json_array_append 末尾添加数组元素,如果原有值是数值或json对 象,则转成数组后,再添加元素
json_array_insert 插入数组元素
json_insert 插入值(插入新值,但不替换已经存在的旧值)
json_merge 合并json数组或对象
json_remove 删除json数据
json_replace 替换值(只替换已经存在的旧值)
json_set 设置值(替换旧值,并插入不存在的新值)
json_unquote 去除json字符串的引号,将值转成string类型
返回json属性
json_depth 返回json文档的最大深度
json_length 返回json文档的长度
json_type 返回json值得类型
json_valid 判断是否为合法json文档

 

 

 

二、使用例子:

 

 

MySQL 5.7.8开始支持 json类型.

 

create table t(id int,js json,PRIMARY KEY (`id`))

插入数据
insert into t values(1,'{"a":1,"s":"abc"}')
insert into t values(2,'[1,2,{"a":123}]')
insert into t values(3,'"str"')
insert into t values(4,'123')

直接提供字符串即可。还可以用JSON_Array和JSON_Object函数来构造
insert into t values(5,JSON_Object('key1',v1,'key2',v2))
insert into t values(4,JSON_Array(v1,v2,v3))

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

 


JSON_SET(json_doc, path, val[, path, val] ...)
修改数据

update t set js=json_set('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') where id=1

结果js={"a":456,"s":"abc","b":"bbb"}

path中$就代表整个doc,然后可以用JavaScript的方式指定对象属性或者数组下标等.
执行效果,类似json的语法
$.a=456
$.b="bbb"

存在就修改,不存在就设置.

$.c.c=123
这个在javascript中会出错,因为.c为null。
但是在json_set('{}','$.c.c',123)中,不存在的路径将直接被忽略。

特殊的对于数组,如果目标doc不是数组则会被转换成[doc],然后再执行set,
如果set的下标超过数组长度,只会添加到数组结尾。

select json_set('{"a":456}','$[1]',123)
结果[{"a":456},123]。目标现被转换成[{"a":456}],然后应用$[1]=123。

select json_set('"abc"','$[999]',123)
结果["abc",123]。

 

再举几个例子
select json_set('[1,2,3]','$[0]',456,'$[3]','bbb')
结果[456,2,3,'bbb']

注意:
对于javascript中
var a=[1,2,3]
a.a='abc'
是合法的,但是一旦a转成json字符串,a.a就丢失了。

而在mysql中,这种算作路径不存在,因此
select json_set('[1,2,3]','$.a',456)
结果还是[1,2,3]

 

然后还有另外两个版本
JSON_INSERT(json_doc, path, val[, path, val] ...)
如果不存在对应属性则插入,否则不做任何变动

JSON_REPLACE(json_doc, path, val[, path, val] ...)
如果存在则替换,否则不做任何变动

这两个操作倒是没有javascript直接对应的操作
select json_insert('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
结果{"a":1,"s":"abc","b":"bbb"}

select json_replace('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
结果{"a":456,"s":"abc"}

加上删除节点
JSON_REMOVE(json_doc, path[, path] ...)
如果存在则删除对应属性,否则不做任何变动
select json_replace('{"a":1,"s":"abc"}','$.a','$.b')
结果{"s":"abc"}

涉及数组时,三个函数与json_set基本一样
select json_insert('{"a":1}','$[0]',456)
结果不变,认为0元素已经存在了,注意这里结果不是[{"a":1}]

select json_insert('{"a":1}','$[999]',456)
结果追加到数组结尾[{"a":1},456]


select json_replace('{"a":1}','$[0]',456)
结果456!而非[456]

select json_replace('{"a":1}','$[1]',456)
结果不变。

其实对于json_insert和json_replace来说一般情况没必要针对数组使用。

 


select json_remove('{"a":1}','$[0]')
结果不变!

select json_remove('[{"a":1}]','$[0]')
结果[]

总之涉及数组的时候要小心。


JSON_MERGE(json_doc, json_doc[, json_doc] ...)
将多个doc合并

select json_merge('[1,2,3]','[4,5]')
结果[1,2,3,4,5]。数组简单扩展

select json_merge('{"a":1}','{"b":2}')
结果{"a":1,"b":2}。两个对象直接融合。

特殊的还是在数组
select json_merge('123','45')
结果[123,45]。两个常量变成数组

select json_merge('{"a":1}','[1,2]')
结果[{"a":1},1,2]。目标碰到数组,先转换成[doc]

select json_merge('[1,2]','{"a":1}')
结果[1,2,{"a":1}]。非数组都追加到数组后面。

 

JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
给指定的节点,添加元素,如果节点不是数组,则先转换成[doc]

select json_Array_append('[1,2]','$','456')
结果[1,2,456]

select json_Array_append('[1,2]','$[0]','456')
结果[[1,456],2]。指定插在$[0]这个节点,这个节点非数组,所以等效为
select json_Array_append('[[1],2]','$[0]','456')


JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
在数组的指定下标处插入元素

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[1]',4)
结果[1,4,2,3]。在$数组的下标1处插入

SELECT JSON_ARRAY_INSERT('[1,[1,2,3],3]','$[1][1]',4)
结果[1,[1,4,2,3],3]。在$[1]数组的下标1处插入

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[0]',4,'$[1]',5)
结果[4,5,1,2,3]。注意后续插入是在前面插入基础上的,而非[4,1,5,2,3]

 

提取json信息的函数
JSON_KEYS(json_doc[, path])
返回指定path的key

select json_keys('{"a":1,"b":2}')
结果["a","b"]

select json_keys('{"a":1,"b":[1,2,3]}','$.b')
结果null。数组没有key

 

JSON_CONTAINS(json_doc, val[, path])
是否包含子文档

select json_contains('{"a":1,"b":4}','{"a":1}')
结果1

select json_contains('{"a":2,"b":1}','{"a":1}')
结果0

select json_contains('{"a":[1,2,3],"b":1}','[1,2]','$.a')
结果1。数组包含则需要所有元素都存在。

select json_contains('{"a":[1,2,3],"b":1}','1','$.a')
结果1。元素存在数组元素中。


JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
检查路径是否存在

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'one','$.a','$.c')
结果1。只要存在一个

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'all','$.a','$.c')
结果0。必须全部存在。


select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.b.c.d')
结果1。

select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.a.c.d')
结果0。


JSON_EXTRACT(json_doc, path[, path] ...)
获得doc中某个或多个节点的值。

select json_extract('{"a":1,"b":2}','$.a')
结果1

select json_extract('{"a":[1,2,3],"b":2}','$.a[1]')
结果2


select json_extract('{"a":{"a":1,"b":2,"c":3},"b":2}','$.a.*')
结果[1,2,3]。a.*通配a所有属性的值返回成数组。


select json_extract('{"a":{"a":1,"b":2,"c":3},"b":4}','$**.b')
结果[2,4]。通配$中所有层次下的属性b的值返回成数组。

mysql5.7.9开始增加了一种简写方式:column->path

select id,js->'$.id' from t where js->'$.a'=1 order by js->'$.b'
等价于
select id,json_extract(js,'$.id') 
from t where json_extract(js,'$.a')=1
order by json_extract(js,'$.b')

 

 

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
强大的查询函数,用于在doc中返回符合条件的节点,select则是在表中返回符合要求的纪录。

select json_search('{"a":"abc","b":{"c":"dad"}}','one','%a%')

结果$.a。和like一样可以用%和_匹配,在所有节点的值中匹配,one只返回一个。

select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%')
结果["$.a","$.b.c"]


select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%',null,'$.b')
结果["$.b.c"]。限制查找范围。

select json_search('{"a":"abc","b":{"c":"dad"},"c":{"b":"aaa"}}','all','%a%',null,'$**.b')
结果["$.b.c","$.c.b"]。查找范围还可使用通配符!在每个匹配节点和其下查找。


注意,只有json_extract和json_search中的path才支持通配,其他json_set,json_insert等都不支持。


JSON_LENGTH(json_doc[, path])
返回数组的长度,如果是object则是属性个数,常量则为1

select json_length('[1,2,3]')
结果3

select json_length('123')
结果1

select json_length('{"a":1,"b":2}')
结果2

可再跟path参数
select json_length('{"a":1,"b":[1,2,3]}','$.b')
结果3


JSON_DEPTH(json_doc)
返回doc深度


select json_depth('{}'),json_depth('[]'),json_depth('123')
结果1,1,1

select json_depth('[1,2,3,4,5,6]')
结果2

select json_depth('{"a":{"b":{"c":1}}}')
结果4

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB/H5性能优化总结

我们今天来说说前端图形渲染优化,因为我接下来的时间可能要开始研究webgl方面的东西,所以就在这里把之前做过的H5做一个总结,现同步发布于GERRY_BLOG,TiMiGerry-知乎,转载请保留链接。静态资源-图片 一 、图片格式JPEG…

C语言数组参数与指针参数

我们都知道参数分为形参和实参。形参是指声明或定义函数时的参数,而实参是在调用函数时主调函数传递过来的实际值。 一、一维数组参数 1、能否向函数传递一个数组?看例子:void fun(char a[10]){char c a[3];}intmain(){char b[10] “abcd…

maven文件结构

pom.xml 用于maven的配置文件 /src 源代码目录 /src/main 工程源代码目录 /src/main/java 工程java源代码目录 /src/main/resource 工程的资源目录 /src/test 单元测试目录 /src/test/java /target 输出目录,所有的输出都存放在这个目录下 /target/classes 编译之…

php如何使用高阶函数

1、首先学会数组转集合的方式 (1)使用collect函数 $arr [1, 2, 3, 4, 5]; $collect collect($arr); (2)使用array_map函数 $arr [1, 2, 3, 4, 5]; $collect array_map(function($item){ return $item *…

Git 使用,命令说明

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. D:\ChengXu\git\Git中双击Git Bash启动git窗口。 2. 这条不能放到博客,是我的账号密码。 3. 添加: git add …

2017ACM/ICPC亚洲区沈阳站 C Hdu-6219 Empty Convex Polygons 计算几何 最大空凸包

题面 题意:给你一堆点,求一个最大面积的空凸包,里面没有点. 题解:红书板子,照抄完事,因为题目给的都是整点,所以最后答案一定是.5或者.0结尾,不用对答案多做处理 1 #include<bits/stdc.h>2 #define N 553 using namespace std;4 struct rec5 {6 double x,y;7 };8 rec…

python读xml文件

# -*- coding:utf-8 -*- import jsonimport requestsimport oscurpathos.path.dirname(os.path.realpath(__file__))xmlpathos.path.join(curpath,read1.xml)with open(xmlpath,encoding"utf-8") as fp: bodyfp.read() print(body)转载于:https://www.cnblogs.…

C语言数组应用

一、数组的内存布局 先看下面的例子&#xff1a;int a[5];所有人都明白这里定义了一个数组&#xff0c;其包含了5 个int 型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素&#xff0c;那么这些元素的名字就是a[0],a[1]…吗&#xff1f;看下面的示意图&#xff1a; 如…

Installation failed, deleting ./composer.json.安装phpunit报错解决方案

是因为你没有装全局的phpunit&#xff0c;安装命令 composer global require phpunit/phpunit 之后你输入 composer require --dev phpunit/phpunit 就发现你安装成功了

MyBatis在Oracle中插入数据并返回主键的问题解决

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 前言&#xff1a;我早期用过这个方法&#xff0c;但是返回的依旧是影响行数&#xff0c;不是主键。 只是这种写法可以达到我要的效果&a…

在 Intellij IDEA 里使用 OpenJFX (JavaFX)

2019独角兽企业重金招聘Python工程师标准>>> JDK 11 把 JavaFX 剥离了出来&#xff0c;形成了单独且开源的 OpenJFX 模块。 本文的目的是通过简单的例子解释这一变化对使用 JavaFX 所造成的影响&#xff0c;并找到一种在 IDEA 2018.2 上使用它的办法。 首先&#xf…

使用phpunit新建项目

1、mkdir test-project 新建一个test-project 2、cd test-project 跑到文件夹中 3、实例化git git init 4、新建phpunit项目 composer require --dev phpunit/phpunit 5、使用gi实例化.gitignore gi composer>.gitignore (如果没有安装gi&#xff0c;请使用命令ec…

如何解决eclipse里面tomcat 8080端口被占用

很多时候运行tomcat 的时候总是会提示tomcat 的端口被占用 但是任务管理器里面还找不到是哪个端口被占用了 因此很多人就重新配置tomcat 或者去修改tomcat的端口号 &#xff0c;其实这么做太麻烦了 &#xff0c;小弟在这里告诉你一个非常简单的方法。 1.在开始菜单中选择运行 …

Selenium UI 举例 getCssValue

selenium jar包中&#xff0c;在WebElement的接口中&#xff0c; String getCssValue(String var1);可以通过标签&#xff0c;获取对应的css值。具体要怎么用呢&#xff0c;如下&#xff1a; WebElement baidu driver.findElement(By.id("su"));su.getCssValue(&quo…

java集合框架中contains(),containsKey()和containsValue()的用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 java集合框架中contains(),containsKey()和containsValue()的用法&#xff1a; List集合的contains()方法用于判断集合中包不包含某个元…

敏捷视频

规模化极限编程的关键抓手&#xff1a;验收条件https://mp.weixin.qq.com/s/aHlSxpMx7DTQXaoEgcAQ3g 5分钟让你子解持续集成https://www.bilibili.com/video/BV1SK411W77W/?spm_id_fromtrigger_reload 5分钟让你学会返工率降低1倍的神技--开卡、验卡https://www.bilibili.com/…

提问的智慧

提问的智慧转载于:https://www.cnblogs.com/whigym/p/10028642.html

C语言指针和数组概述

几乎每次讲课讲到指针和数组时&#xff0c;我总会反复不停的问学生&#xff1a;到底什么是指针&#xff1f;什么是数组&#xff1f;他们之间到底是什么样的关系。从几乎没人能回答明白到几乎都能回答明白&#xff0c;需要经历一段“惨绝人寰”的痛。指针是C/C的精华&#xff0c…

Linux tee的花式用法和pee

1.tee多重定向 tee [options] FILE1 FILE2 FILE3... tee的作用是将一份标准输入多重定向&#xff0c;一份重定向到标准输出/dev/stdout&#xff0c;然后还将标准输入重定向到每个文件FILE中。 例如&#xff1a; $ cat alpha.log | tee file1 file2 file3 | cat $ cat alpha.log…

[CF893F]Subtree Minimum Query

题目大意&#xff1a; 给你一颗有根树&#xff0c;点有权值&#xff0c;m次询问&#xff0c;每次问你某个点的子树中距离其不超过k的点的权值的最小值。&#xff08;边权均为1&#xff0c;点权有可能重复&#xff0c;k值每次询问有可能不同&#xff0c;强制在线&#xff09; 做…