在 MySQL 中,JSON_EXTRACT()
函数用于从 JSON 文档中提取一个或多个值。这个函数非常有用,特别是在处理存储在 JSON 格式中的复杂数据时。下面是一些关于如何使用 JSON_EXTRACT()
的详细说明和示例。
JSON_EXTRACT(json_doc, path [, path] ...)
json_doc
: 要从中提取值的 JSON 文档。path
: 一个或多个路径表达式,用于指定要提取的值的位置。路径表达式以 $
开头,表示 JSON 文档的根。路径表达式使用类似于 JavaScript 的对象和数组访问语法:
.
访问,例如 $.name
。[]
访问,例如 $[0]
。$.address.street
或 $.items[0].name
。假设有一个表 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"}');
我们可以使用 JSON_EXTRACT()
提取每个用户的名字:
SELECT id, JSON_EXTRACT(data, '$.name') AS name
FROM users;
输出结果:
+----+--------+
| id | name |
+----+--------+
| 1 | "Alice"|
| 2 | "Bob" |
+----+--------+
假设 JSON 数据中包含嵌套的对象:
INSERT INTO users (id, data) VALUES
(3, '{"name": "Charlie", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}');
我们可以提取嵌套的街道地址:
SELECT id, JSON_EXTRACT(data, '$.address.street') AS street
FROM users;
输出结果:
+----+-----------------+
| id | street |
+----+-----------------+
| 1 | NULL |
| 2 | NULL |
| 3 | "123 Main St" |
+----+-----------------+
假设 JSON 数据中包含一个数组:
INSERT INTO users (id, data) VALUES
(4, '{"name": "David", "age": 40, "hobbies": ["reading", "traveling", "cooking"]}');
我们可以提取数组中的第一个爱好:
SELECT id, JSON_EXTRACT(data, '$.hobbies[0]') AS hobby
FROM users;
输出结果:
+----+----------+
| id | hobby |
+----+----------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | "reading"|
+----+----------+
JSON_EXTRACT()
返回的结果是一个 JSON 值,即使它是标量值(如字符串或数字)。如果需要将结果转换为标量类型,可以使用 CAST
函数。例如:
SELECT id, CAST(JSON_EXTRACT(data, '$.name') AS CHAR) AS name
FROM users;
如果路径表达式指向的值不存在,JSON_EXTRACT()
将返回 NULL
。
路径表达式中的索引是从 0 开始的。