【MySQL】MySQL函数之JSON_EXTRACT

在 MySQL 中,JSON_EXTRACT() 函数用于从 JSON 文档中提取一个或多个值。这个函数非常有用,特别是在处理存储在 JSON 格式中的复杂数据时。下面是一些关于如何使用 JSON_EXTRACT() 的详细说明和示例。

基本语法

sql 复制代码
JSON_EXTRACT(json_doc, path [, path] ...)
  • json_doc: 要从中提取值的 JSON 文档。
  • path: 一个或多个路径表达式,用于指定要提取的值的位置。路径表达式以 $ 开头,表示 JSON 文档的根。

路径表达式

路径表达式使用类似于 JavaScript 的对象和数组访问语法:

  • 对象属性:使用点 . 访问,例如 $.name
  • 数组元素:使用方括号 [] 访问,例如 $[0]
  • 嵌套结构:可以组合使用点和方括号,例如 $.address.street$.items[0].name

示例

示例 1: 提取简单值

假设有一个表 users,其中有一个字段 data 存储了用户的 JSON 数据:

sql 复制代码
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() 提取每个用户的名字:

sql 复制代码
SELECT id, JSON_EXTRACT(data, '$.name') AS name
FROM users;

输出结果:

复制代码
+----+--------+
| id | name   |
+----+--------+
| 1  | "Alice"|
| 2  | "Bob"  |
+----+--------+
示例 2: 提取嵌套值

假设 JSON 数据中包含嵌套的对象:

sql 复制代码
INSERT INTO users (id, data) VALUES
(3, '{"name": "Charlie", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}');

我们可以提取嵌套的街道地址:

sql 复制代码
SELECT id, JSON_EXTRACT(data, '$.address.street') AS street
FROM users;

输出结果:

复制代码
+----+-----------------+
| id | street          |
+----+-----------------+
| 1  | NULL            |
| 2  | NULL            |
| 3  | "123 Main St"   |
+----+-----------------+
示例 3: 提取数组中的值

假设 JSON 数据中包含一个数组:

sql 复制代码
INSERT INTO users (id, data) VALUES
(4, '{"name": "David", "age": 40, "hobbies": ["reading", "traveling", "cooking"]}');

我们可以提取数组中的第一个爱好:

sql 复制代码
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 函数。例如:

    sql 复制代码
    SELECT id, CAST(JSON_EXTRACT(data, '$.name') AS CHAR) AS name
    FROM users;
  • 如果路径表达式指向的值不存在,JSON_EXTRACT() 将返回 NULL

  • 路径表达式中的索引是从 0 开始的。

相关推荐
Dxy12393102164 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light4 小时前
MySQL相关问题
数据库·mysql
蜡笔小炘5 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长5 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚6 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设6 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据6 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300966 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
m0_736919107 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
亓才孓7 小时前
[JDBC]PreparedStatement替代Statement
java·数据库