Mysql8.0之JSON函数
Mysql8.0之JSON函数
官方参考手册:https://dev.mysql.com/doc/refman/8.0/en/json-functions.html
MYSQL5.7.8开始,就支持JSON数据类型的存储了。
1.Json函数
-
创建Json值的函数
-
JSON_ARRAY()
: 创建json数组SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
-
JSON_OBJECT
: 创建json对象SELECT JSON_OBJECT('id', 87, 'name', 'carrot');
-
JSON_QUOTE(string)
: 通过用双引号字符包装字符串并转义内部引号和其他字符,将字符串引用为 JSON 值,然后将结果作为utf8mb4
字符串返回SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"');
-
-
搜索Json值的函数
-
JSON_CONTAINS(target,condicate[,path])
通过返回 1 或 0 来指示给定的
candidate
JSON 文档是否包含在target
JSON 文档中,或者(如果path
提供了参数)是否在目标内的特定路径中找到候选对象SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}'; SET @j2 = '1'; SELECT JSON_CONTAINS(@j, @j2, '$.a'); -- 其中$表示json字符串本身,$.a表示json字符串中属性名为a
-
JSON_CONTAINS_PATH(json_doc,one_or_all,path[,path])
返回 0 或 1 以指示 JSON 文档是否包含给定路径或路径中的键名;
如果文档中不存在指定的路径,则返回值为 0。否则,返回值取决于
one_or_all
参数:'one'
: 如果文档中至少存在一个路径,则为 1,否则为 0。'all'
: 如果所有路径都存在于文档中,则为 1,否则为 0。
SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}'; SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e'); -- 查询Json字符串中是否存在属性名为a或e SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e'); -- 查询Json字符串中是否存在属性名为a和e同时存在
-
JSON_EXTRACT(json_doc,path[,path])
从 JSON 字符串中返回数据,从与
path
参数匹配的json字符串中key的值SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');-- 如果json字符串数组的话,$[1]表示json字符数组中的第2个元素的值 SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]'); -- 返回结果:[20,10] SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]');-- 返回结果 :[30,40]
mysql支持使用
->
运算符作为此函数的简写,其中是左侧是json字符串所在列的字段名,右侧是要在json字符串中匹配的json路径,即json字符串中的属性名-
column->path
-- 查询表中data字段中json字符串数组第一个对象的id属性的值 SELECT a.`data`->'$[0].id' as id from wssl_order_info_b a; -- > 等价于 SELECT JSON_EXTRACT(a.`data`, '$[0].id') as id FROM wssl_order_info_b a LIMIT 1;
查询结果:
//表wssl_order_info_b中data字段中存储的json字符串值 [{"": "", "id": "1120280820040", "goodsPrn": "1120280820040", "org_sc_name": "", "sample_name": "西瓜", "sample_brand": "", "sample_status": "YPZT_DRK", "sample_quantity": "", "sample_manu_date": ""}]
-
column->>path
这是一个改进的、不带引号的提取操作符。
column->>path
等价于JSON_UNQUOTE(JSON_EXTRACT(column,path))
或JSON_UNQUOTE(column->path)
SELECT a.`data`->>'$[0].id' as id from wssl_order_info_b a LIMIT 1
-
-
JSON_OVERLAPS(json_doc1,json_doc2)
比较2个json字符串中,有任何共同的键值对或数组元素则返回true -
JSON_SEARCH(json_doc,one_or_all,search_str)
返回json字符串中属性值等于search_str的属性名(属性名的路径eg$.a或$[0]),如果不存在则返回Null -
JSON_VALUE(json_doc,path)
在 MySQL 8.0.21 中引入,根据属性名的路径查询json字符串中属性值
-
-
修改Json值得函数
JSON_ARRAY_APPEN(Json_doc,path,val[,path,val])
将值附加到 JSON 文档中指定数组的末尾并返回结果JSON_ARRAY_INSERT(json_doc,path,val)
将数据插入 JSON 文档并返回结果JSON_Merge(json_doc1,json_doc2...)
合并2个或多个json字符串JSON_MERGE_PATH(json_doc1,json_doc2...)
执行两个或多个 JSON 文档的 RFC 7396兼容合并并返回合并结果,而不保留具有重复键的成员