前置工作
create table `mk_task_record` ( `task_id` int not null auto_increment, `task_name` varchar(50) default null, `result_json` json default null, `result_str` longtext, `create_time` datetime default null, `update_time` datetime default null, primary key (`task_id`), key `task_name` (`task_name`) using btree ) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci;
插入数据:
插入带转义符的json:
insert into `test`.`mk_task_record`(`task_id`, `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) values (1, '哈哈1', '{\"age\": 22, \"name\": \"李四\", \"major\": \"计算机科学\", \"university\": \"清华大学\", \"is_graduated\": false}', '{\r\n \"name\": \"李四\",\r\n \"age\": 22,\r\n \"major\": \"计算机科学\",\r\n \"university\": \"清华大学\",\r\n \"is_graduated\": false\r\n}', '2025-01-01 00:13:49', '2025-01-01 00:13:52'); insert into `test`.`mk_task_record`(`task_id`, `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) values (2, '哈哈2', '{\"age\": 22, \"name\": \"张三\", \"major\": \"计算机科学\", \"university\": \"清华大学\", \"is_graduated\": false}', '{\r\n \"name\": \"张三\",\r\n \"age\": 22,\r\n \"major\": \"计算机科学\",\r\n \"university\": \"清华大学\",\r\n \"is_graduated\": false\r\n}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');
插入不带转义符的json:
insert into `test`.`mk_task_record`( `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) values ( '哈哈3', '{"name": "王五", "age": 35, "address": {"street": "123 main st", "city": "chicago"}}', '{"name": "王五", "age": 35, "address": {"street": "123 main st", "city": "chicago"}}', '2025-01-01 00:13:49', '2025-01-01 00:13:52'); insert into `test`.`mk_task_record`( `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) values ( '哈哈4', '{"name": "赵六", "age": 30, "address": {"street": "123 main st", "city": "chicago"}}','{"name": "赵六", "age": 30, "address": {"street": "123 main st", "city": "chicago"}}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');
- result_json是json格式;
- result_result是longtext格式;
经过实际测试,json、varchar、text类型的json格式都可以使用以下的函数,且效果相同。
一、json_extract 提取指定数据
1.1 提取简单值
select json_extract(result_str,'$.name') from mk_task_record; select json_extract(result_json,'$.name') from mk_task_record;
- json类型:
- text类型
结果也带引号;
如何去掉引号呢?
——查看【四、json_unquote 取消双引号】
- 作条件查询
select *from mk_task_record where json_extract(result_str,'$.name') ='张三'; select *from mk_task_record where json_extract(result_json,'$.name') ='张三';
两条sql返回的都一样:
二、字段->'$.json属性’进行查询条件,以及数据反显
select result_json->'$.name' from mk_task_record;
作为查询条件,不用转移双引号。
三、json_unquote 取消双引号
json_unquote() 函数取消双引号引用 json 值,并将结果作为字符串返回。
3.1 语法:
json_unquote(json_val)
参数说明:
json_val:必需的。一个字符串。
返回值:
取消双引号引用 json 值
返回null情况:参数为 null。
报错情况:不是有效的 json 字符串文本。能够识别下表中的转义字符:
- ":双引号 "
- \b:退格字符
- \f:换页符
- \n:换行符
- \r:回车符
- \t:制表符
- \:反斜杠
- \uxxxx:unicode 值 xxxx 的 utf-8 字节
3.2 示例:
select json_unquote(json_extract(result_json,'$.name')) from mk_task_record;
五、json_search 查找
json_search() 函数返回一个给定字符串在一个 json 文档中的路径。
5.1 语法:
json_search(json, one_or_all, search_str) json_search(json, one_or_all, search_str, escape_char) json_search(json, one_or_all, search_str, escape_char, path)
参数说明:
- on:必需的。一个 json 文档。
- one_or_all:必需的。可用值:‘one’, ‘all’。
- 规则如下:‘one’:返回第一个匹配的路径。‘all’:返回所有匹配的路径。所有的路径会包装在一个数组内返回。
- search_str:必需的。被搜索的字符串。 您可以在 search_str 参数中使用 % 和 _ 通配符,就像 like 一样:% 匹配任意数量的任意字符。_ 匹配一个任意字符。
- escape_char:可选的。 如果 search_str 中包含 % 和 _,需要在他们之前添加转移字符。默认是 \。
- path:可选的。只能在此路径下进行搜索。
返回值:一个路径字符串或者由多个路径组成的数组。返回 null情况:未搜索到指定的字符串。json 文档中不存在指定的 path。任意一个参数为 null。
报错情况:json 不是有效的 json 文档。path 不是有效的路径表达式。
5.2 示例:
select *from mk_task_record where json_search(result_json,'one','张三');
六、json_set 插入或更新数据
json_set() 函数在一个 json 文档中插入或更新数据并返回新的 json 文档。它相当于是 json_insert() 和 json_replace() 的组合。
6.1 语法:
json_set(json, path, value[, path2, value2] ...)
参数说明:
- json:必需的。被修改的 json 文档。
- path:必需的。一个有效的路径表达式,它不能包含 * 或 **。
- value:必需的。要设置的数据。
插入或更新数据并返回新的 json 文档。规则如下:
- 存在路径:更新。
- 不存在路径:添加。
- 若value 为字符串:直接插入。
- 返回 null情况:json 文档或者路径为 null。
报错情况:json 不是有效的 json 文档。
path 不是有效的路径表达式或者其中包含 * 或 **。
6.2 示例:
update mk_task_record set result_str = json_set(result_str, '$.name', '王麻子', '$.age', '36') where task_id =1;
七、json_contains 判断是否包含
json_contains() 函数检查一个 json 文档中是否包含另一个 json 文档。
7.1 语法:
json_contains(target_json, candidate_json) json_contains(target_json, candidate_json, path)
参数说明:
- target_json必需的。一个 json 文档。
- candidate_json:必需的。被包含的 json 文档。
- path:可选的。一个路径表达式。
- 返回值:
包含:返回1。
不包含:返回0。
返回 null情况:json 文档中不存在指定的路径。
任意一个参数为 null。
报错情况:
json 不是有效的 json 文档。path 不是有效的路径表达式。
示例:
select * from mk_task_record where json_contains(result_json, '"张三"','$.name');
注意:"张三"有双引号一定加,否则报错:
八、json_remove 删除指定数据
json_remove() 函数从一个 json 文档中删除由路径指定的数据并返回修改后的 json 文档。
8.1 语法:
json_remove(json, path[, path] ...)
参数说明:
- json:必需的。一个 json 文档。
- path:必需的。一个有效的路径表达式,它不能包含 * 或 **。
返回值:删除后的json文档。
8.2 示例:
select json_remove(result_str,'$.major') from mk_task_record where task_id =1;
九、json_replace 替换数据
json_replace() 函数在一个 json 文档中替换已存在的数据并返回新的 json 文档
9.1 语法:
json_replace(json, path, value[, path2, value2] ...)
参数说明:
- json:必需的。被修改的 json 文档。
- path:必需的。一个有效的路径表达式,它不能包含 * 或 **。
- value:必需的。新的数据。
- 返回值:替换后的json文档。回 null情况:json 文档或者路径为 null。
报错情况:
json 不是有效的 json 文档。path 不是有效的路径表达式或者其中包含 * 或 **。
9.2 示例:
select json_replace(result_str,'$.university','复旦大学') from mk_task_record where task_id =1;
拓展:
总结
到此这篇关于mysql数据库中查询json技巧大全的文章就介绍到这了,更多相关mysql查询json技巧内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论