在 MySQL 中,JSON_UNQUOTE()
函数用于去除 JSON 值周围的双引号,并将其转换为普通的字符串或数值。这个函数特别适用于从 JSON 文档中提取的值,因为这些值通常会被包含在双引号中。
基本语法
JSON_UNQUOTE(json_value)
json_value
: 要去引号的 JSON 值。
示例
假设有一个表 users
,其中有一个字段 data
存储了用户的 JSON 数据:
CREATE TABLE users (id INT PRIMARY KEY,data JSON
);INSERT INTO users (id, data) VALUES
(1, '{"name": "Alice", "age": 30, "city": "New York"}'),
(2, '{"name": "Bob", "age": 25, "city": "Los Angeles"}');
示例 1: 去除提取的字符串值的双引号
SELECT id, JSON_UNQUOTE(JSON_EXTRACT(data, '$.name')) AS name
FROM users;
输出结果:
+----+--------+
| id | name |
+----+--------+
| 1 | Alice |
| 2 | Bob |
+----+--------+
示例 2: 去除提取的数值值的双引号
SELECT id, JSON_UNQUOTE(JSON_EXTRACT(data, '$.age')) AS age
FROM users;
输出结果:
+----+-----+
| id | age |
+----+-----+
| 1 | 30 |
| 2 | 25 |
+----+-----+
示例 3: 去除嵌套值的双引号
假设 JSON 数据中包含嵌套的对象:
INSERT INTO users (id, data) VALUES
(3, '{"name": "Charlie", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}');
我们可以提取嵌套的街道地址并去除双引号:
SELECT id, JSON_UNQUOTE(JSON_EXTRACT(data, '$.address.street')) AS street
FROM users;
输出结果:
+----+-------------+
| id | street |
+----+-------------+
| 1 | NULL |
| 2 | NULL |
| 3 | 123 Main St |
+----+-------------+
示例 4: 去除数组中的值的双引号
假设 JSON 数据中包含一个数组:
INSERT INTO users (id, data) VALUES
(4, '{"name": "David", "age": 40, "hobbies": ["reading", "traveling", "cooking"]}');
我们可以提取数组中的第一个爱好并去除双引号:
SELECT id, JSON_UNQUOTE(JSON_EXTRACT(data, '$.hobbies[0]')) AS hobby
FROM users;
输出结果:
+----+----------+
| id | hobby |
+----+----------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | reading |
+----+----------+
注意事项
JSON_UNQUOTE()
只会去除最外层的双引号。如果 JSON 值本身包含嵌套的双引号,这些嵌套的双引号不会被去除。- 如果
json_value
不是有效的 JSON 值,JSON_UNQUOTE()
将返回NULL
。 - 如果
json_value
本身就是NULL
,JSON_UNQUOTE()
也将返回NULL
。
组合使用
JSON_UNQUOTE()
通常与 JSON_EXTRACT()
一起使用,以便从 JSON 文档中提取值并将其转换为普通的数据类型。例如:
SELECT id, JSON_UNQUOTE(JSON_EXTRACT(data, '$.name')) AS name,JSON_UNQUOTE(JSON_EXTRACT(data, '$.age')) AS age,JSON_UNQUOTE(JSON_EXTRACT(data, '$.address.street')) AS street
FROM users;
输出结果:
+----+--------+-----+-------------+
| id | name | age | street |
+----+--------+-----+-------------+
| 1 | Alice | 30 | NULL |
| 2 | Bob | 25 | NULL |
| 3 | Charlie| 35 | 123 Main St |
| 4 | David | 40 | NULL |
+----+--------+-----+-------------+