MySQL JSON 常用函数

MySQL 提供了丰富的函数对 JSON 类型执行操作,详见官方文档

函数 说明
JSON_EXTRACT() 提取值。
-> JSON_EXTRACT() 函数的简写。
JSON_SET() 替换现有值并添加不存在的值。
JSON_INSERT() 插入值而不替换现有值。
JSON_REPLACE() 只替换现有值。
JSON_REMOVE() 删除值。
JSON_UNQUOTE() 去除引号。
->> JSON_EXTRACT() 和 JSON_UNQUOTE() 函数的简写。
下面三个表达式返回相同的值:
JSON_UNQUOTE(JSON_EXTRACT(column, path))
JSON_UNQUOTE(column -> path)
column ->> path
CAST(… AS JSON) 将数据转换成 JSON 类型。
JSON_OBJECT() 将数据转换成 JSON 类型。
JSON_ARRAY() 将数据转换成 JSON 类型。

创建表 test_json,basic_info 字段为 JSON 类型:

CREATE TABLE test_json (
	id INT ( 11 ) NOT NULL AUTO_INCREMENT,
	basic_info json DEFAULT NULL,
	PRIMARY KEY ( id )
) ENGINE = INNODB DEFAULT CHARSET = utf8;

插入数据:

INSERT INTO test_json VALUES ( 1, '[{"name":"小明", "age":6},{"name":"小刚", "age":8}]'),
							 ( 2, '{"name":["小华", "小东"], "age":[10, 12]}');

一、检索 JSON

1.1 查找 JSON 中某个字段

方式一:

SELECT JSON_EXTRACT( basic_info, '$[0]' ) FROM test_json WHERE id = 1;
SELECT JSON_EXTRACT( basic_info, '$.name' ) FROM test_json WHERE id = 2;
SELECT JSON_EXTRACT( basic_info, '$[0].name' ) FROM test_json WHERE id = 1;
SELECT JSON_EXTRACT( basic_info, '$.name[0]' ) FROM test_json WHERE id = 2;

结果 1
JSON_EXTRACT( basic_info, '$[0]' )
{
   
   "age": 6, "name": "小明"}
结果 2
JSON_EXTRACT( basic_info, '$.name' )
["小华", "小东"]
结果 3
JSON_EXTRACT( basic_info, '$[0].name' )
"小明"
结果 4
JSON_EXTRACT( basic_info, '$.name[0]' )
"小华"

方式二:

SELECT basic_info -> '$[0]' FROM test_json WHERE id = 1;
SELECT basic_info -> '$.name' FROM test_json WHERE id = 2;
SELECT basic_info -> '$[0].name' FROM test_json WHERE id = 1;
SELECT basic_info -> '$.name[0]' FROM test_json WHERE id = 2;

结果 1
basic_info -> '$[0]'
{
   
   "age": 6, "name": "小明"}
结果 2
basic_info -> '$.name'
["小华", "小东"]
结果 3
basic_info -> '$[0].name'
"小明"
结果 4
basic_info -> '$.name[0]'
"小华"

1.2 根据 JSON 中某个字段查询

方式一:

SELECT * FROM test_json WHERE JSON_EXTRACT( basic_info, '$[0].name' ) = '小明';

结果 1
id	basic_info
1	[{
   
   "age": 6, "name": "小明"}, {
   
   "age": 8, "name": "小刚"}]

方式二:

SELECT * FROM test_json WHERE basic_info -> '$[0].name' = '小明';

结果 1
id	basic_info
1	[{
   
   "age": 6, "name": "小明"}, {
   
   "age": 8, "name": "小刚"}]

二、修改 JSON

2.1 修改 JSON 中某个字段

可以使用 JSON_REPLACE() 或者 JSON_SET() 函数:

UPDATE test_json SET basic_info = JSON_REPLACE( basic_info, '$[0].age', 16, '$[0].gender', '男') WHERE id = 1;
或者
UPDATE test_json SET basic_info = JSON_SET( basic_info, '$[1].age', 18, '$[1].gender', '男' ) WHERE id = 1;

结果 1
id	basic_info
1	[{
   
   "age": 16, "name": "小明"}, {
   
   "age": 8, "name": "小刚"}]
结果 2
id	basic_info
1	[{
   
   "age": 16, "name": "小明"}, {
   
   "age": 18, "name": "小刚", "gender": "男"}]

2.2 往 JSON 中插入新字段

可以使用 JSON_INSERT() 或者 JSON_SET() 函数:

UPDATE test_json SET basic_info = JSON_INSERT( basic_info, '$.name[0]', '小花', '$.age[2]', 14 ) WHERE id = 2;
或者
UPDATE test_json SET basic_info = JSON_SET( basic_info, '$.name[0]', '小花', '$.name[2]', '小强' ) WHERE id = 2;

结果 1
id	basic_info
2	{
   
   "age": [10, 12, 14], "name": ["小华", "小东"]}
结果 2
id	basic_info
2	{
   
   "age": [10, 12, 14], "name": ["小花", "小东", "小强"]}

2.3 删除 JSON 中某个字段

可以使用 JSON_REMOVE() 函数:

UPDATE test_json SET basic_info = JSON_REMOVE( basic_info, '$[1].gender' ) WHERE id = 1;

结果 1
id	basic_info
1	[{
   
   "age": 16, "name": "小明"}, {
   
   "age": 18, "name": "小刚"}]

2.4 JSON_SET()、JSON_INSERT() 和 JSON_REPLACE() 函数的区别

JSON_SET() 替换现有值并添加不存在的值。
JSON_INSERT() 插入值而不替换现有值。
JSON_REPLACE() 只替换现有值。

三、去除引号使用 JSON_UNQUOTE() 函数

方式一:

SELECT JSON_UNQUOTE( JSON_EXTRACT( basic_info, '$[0].name' )) FROM test_json WHERE id = 1;

结果 1
JSON_UNQUOTE( JSON_EXTRACT( basic_info, '$[0].name' ))
小明

方式二:

SELECT JSON_UNQUOTE( basic_info -> '$[0].name' ) FROM test_json WHERE id = 1;

结果 1
JSON_UNQUOTE( basic_info -> '$[0].name' )
小明

方式三:

SELECT basic_info ->> '$[0].name' FROM test_json WHERE id = 1;

结果 1
basic_info ->> '$[0].name'
小明

四、将数据转换成 JSON 类型

可以使用 CAST(… AS JSON) 或者 JSON_OBJECT() 或者 JSON_ARRAY() 函数:

SELECT * FROM test_json WHERE basic_info -> '$[0]' = CAST( '{"name":"小明", "age":16}' AS JSON );
或者
SELECT * FROM test_json WHERE basic_info -> '$[1]' = JSON_OBJECT( 'name', '小刚', 'age', 18 );
或者
SELECT * FROM test_json WHERE basic_info -> '$.name' = JSON_ARRAY( '小花', '小东', '小强' );

结果 1
id	basic_info
1	[{
   
   "age": 16, "name": "小明"}, {
   
   "age": 18, "name": "小刚"}]
结果 2
id	basic_info
1	[{
   
   "age": 16, "name": "小明"}, {
   
   "age": 18, "name": "小刚"}]
结果 3
id	basic_info
2	{
   
   "age": [10, 12, 14], "name": ["小花", "小东", "小强"]}

注意:如果不将字符串转换成 JSON 类型查询结果为空:

SELECT * FROM test_json WHERE basic_info -> '$[0]' = '{"name":"小明", "age":16}';

结果 1
id	basic_info

猜你喜欢

转载自blog.csdn.net/weixin_56175092/article/details/120847344