mysqljson_keys_详解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中
.a=456
$.b="bbb"
json值的类型有哪些存在就修改,不存在就设置.
$.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"}','
.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]','/article>,'456')
结果[1,2,456]
select json_Array_append('[1,2]','$[0]','456')
结果[[1,456],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'
等价于
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论