文章目录 一、前言二、创建示例表三、基本语法- 获取JSON对象中某个key对应的value值- 获取JSON数组中某个元素- 获取JSON中的嵌套数据 四、渐入佳境- 获取JSON多个路径的数据- 路径表达式*的使用- 返回
Mysql5.7版本开始支持JSON类型字段,本文详细介绍json_extract函数如何获取mysql中的JSON类型数据
json_extract可以完全简写为 ->
json_unquote(json_extract())可以完全简写为 ->>
下面介绍中大部分会利用简写
CREATE TABLE `test_json` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` json DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
# 插入两条测试用的记录INSERT INTO `test_json` (`content`) VALUES ('{\"name\":\"tom\",\"age\":18,\"score\":[100,90,87],\"address\":{\"province\":\"湖南\",\"city\":\"长沙\"}}');INSERT INTO `test_json` (`content`) VALUES ('[1, "apple", "red", {"age": 18, "name": "tom"}]');
id | content |
---|---|
1 | {“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}} |
2 | [1, “apple”, “red”, {“age”: 18, “name”: “tom”}] |
content:
{“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}
# 得到"tom"select json_extract(content,'$.name') from test_json where id = 1;# 简写方式:字段名->表达式等价于json_extract(字段名,表达式)select content->'$.name' from test_json where id = 1;# 结果:+--------------------------------+| json_extract(content,'$.name') |+--------------------------------+| "tom" |+--------------------------------++-------------------+| content->'$.name' |+-------------------+| "tom" |+-------------------+# 解除双引号,得到tomselect json_unquote(json_extract(content,'$.name')) from test_json where id = 1;# 简写方式:字段名->>表达式等价于json_unquote(json_extract(字段名,表达式))select content->>'$.name' from test_json where id = 1;# 结果:+----------------------------------------------+| json_unquote(json_extract(content,'$.name')) |+----------------------------------------------+| tom |+----------------------------------------------++--------------------+| content->>'$.name' |+--------------------+| tom |+--------------------+
content:
[1, “apple”, “red”, {“age”: 18, “name”: “tom”}]
# 得到"apple"select json_extract(content,'$[1]') from test_json where id = 2;# 简写,效果同上select content->'$[1]' from test_json where id = 2;# 结果:+------------------------------+| json_extract(content,'$[1]') |+------------------------------+| "apple" |+------------------------------++-----------------+| content->'$[1]' |+-----------------+| "apple" |+-----------------+# 解除双引号,得到apple select json_unquote(json_extract(content,'$[1]')) from test_json where id = 2;# 简写,效果同上select content->>'$[1]' from test_json where id = 2;# 结果:+--------------------------------------------+| json_unquote(json_extract(content,'$[1]')) |+--------------------------------------------+| apple |+--------------------------------------------++------------------+| content->>'$[1]' |+------------------+| apple |+------------------+
content: id=1
{“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}
content: id=2
[1, “apple”, “red”, {“age”: 18, “name”: “tom”}]
# 得到:87select content->'$.score[2]' from test_json where id = 1;# 结果:+-----------------------+| content->'$.score[2]' |+-----------------------+| 87 |+-----------------------+# 得到:18select content->'$[3].age' from test_json where id = 2;# 结果:+---------------------+| content->'$[3].age' |+---------------------+| 18 |+---------------------+
content: id=1
{“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}
select json_extract(content,'$.age','$.score') from test_json where id = 1;# 结果:+-----------------------------------------+| json_extract(content,'$.age','$.score') |+-----------------------------------------+| [18, [100, 90, 87]] |+-----------------------------------------+select json_extract(content,'$.name','$.address.province','$.address.city') from test_json where id = 1;# 结果:+----------------------------------------------------------------------+| json_extract(content,'$.name','$.address.province','$.address.city') |+----------------------------------------------------------------------+| ["tom", "湖南", "长沙"] |+----------------------------------------------------------------------+
# 先插入一条用于测试的数据INSERT INTO `test_json` (`id`,`content`) VALUES(3,'{"name":"tom","address":{"name":"中央公园","city":"长沙"},"class":{"id":3,"name":"一年三班"},"friend":[{"age":20,"name":"marry"},{"age":21,"name":"Bob"}]}')
content: id=3
{“name”: “tom”, “class”: {“id”: 3, “name”: “一年三班”}, “friend”: [{“age”: 20, “name”: “marry”}, {“age”: 21, “name”: “Bob”}], “address”: {“city”: “长沙”, “name”: “中央公园”}}
# 获取所有二级嵌套中key=name的值# 由于friend的二级嵌套是一个数组,所以.name获取不到其中的所有name值select content->'$.*.name' from test_json where id = 3;+----------------------------------+| content->'$.*.name' |+----------------------------------+| ["一年三班", "中央公园"] |+----------------------------------+```# 获取所有key为name值的数据,包括任何嵌套内的nameselect content->'$**.name' from test_json where id = 3;+---------------------------------------------------------+| content->'$**.name' |+---------------------------------------------------------+| ["tom", "一年三班", "marry", "Bob", "中央公园"] |+---------------------------------------------------------+# 获取数组中所有的name值select content->'$.friend[*].name' from test_json where id = 3;+-----------------------------+| content->'$.friend[*].name' |+-----------------------------+| ["marry", "Bob"] |+-----------------------------+
content: id=1
{“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}
# age路径不存在,返回NULL# 若有多个路径,只要有一个路径存在则不会返回NULLselect json_extract(content,'$.price') from test_json where id = 1;+---------------------------------+| json_extract(content,'$.price') |+---------------------------------+| NULL|+---------------------------------+
# 存在任意路径为NULL则返回NULLselect json_extract(content,'$.age',NULL) from test_json where id = 1;+------------------------------------+| json_extract(content,'$.age',NULL) |+------------------------------------+| NULL |+------------------------------------+
select json_extract('{1,2]',$[0])
select content->'$age' from test_json where id = 1;# 结果:ERROR 3143 (42000): Invalid JSON path expression. The error is around character position 1.
mysql5.7官方文档
https://www.sjkjc.com/mysql-ref/json_extract
--结束END--
本文标题: mysql中json_extract的使用方法
本文链接: https://lsjlt.com/news/373345.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0