MySQL JSON_TABLE() 函数

JSON_TABLE函数用于将JSON文档转换为关系表,支持从JSON数组中提取数据。在给定的JSON路径表达式下,COLUMNS子句定义了列名和类型。例如,对于包含对象的数组,可以提取成员x和y;对于值直接作为数组元素的情况,可以获取自增序号id和数组值x。此功能在MySQL8.0及以上版本可用,是处理JSON字段查询的有效工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍:JSON_TABLE()函数从一个指定的JSON文档中提取数据并返回一个具有指定列的关系表。

应用:数据库字段以JSON 存储后,实际应用需要对其中一个字段进行查询

语法:JSON_TABLE(json,path COLUMNS(column[,column[,...]]))column:name

实例:

  • 数组分别取值

JSON 数组中有两个对象。

路径表达式 $[*] 则表示数组中的每个元素。

COLUMNS 子句定义了关系表中的 3 个列:

  • id FOR ORDINALITY: 列名为 id,列的内容为从 1 开始的自增序列。
  • x varchar(255) PATH '$.x': 列名为 x,列的内容是对应了对象中的成员 x
  • y INT PATH '$.y':列名为 y,列的内容是对应了对象中的成员 y
select * FROM
    JSON_TABLE(
        '[{"x": "01", "y": 11}, {"x": "02", "y": 22}]',
        '$[*]'
        COLUMNS (
            id FOR ORDINALITY,
            x varchar(255) PATH '$.x',
            y INT PATH '$.y'
        )
    ) AS t;

|id |x  |y  |
|---|---|---|
|1  |01 |11 |
|2  |02 |22 |

  • 直接取值

JSON 数组中有多个对象。

路径表达式 $[*] 则表示数组中的每个元素。

COLUMNS 子句定义了关系表中的 2 个列:

  • id FOR ORDINALITY: 列名为 id,列的内容为从 1 开始的自增序列。
  • x INT PATH '$': 列名为 x,列的内容是对应了对象的值。
select * FROM
    JSON_TABLE(
        '["1","11","111"]',
        '$[*]'
        COLUMNS (
            id FOR ORDINALITY,
            x INT PATH '$'
        )
    ) AS t;

|id |x  |
|---|---|
|1  |1  |
|2  |11 |
|3  |111|

备注:MySQL 8.0之后才能使用,否则执行代码会报错

替代查询方法:select * from table where name like '%"1"%'

参考:MySQL JSON_TABLE() 函数|mysql-目之瞬间

### 使用 `JSON_TABLE` 函数解析 #### 解析 JSON 数据并创建虚拟表 在 MySQL 8.0.4 版本及以上,提供了强大的 `JSON_TABLE` 函数用于处理存储于数据库中的 JSON 类型数据。此函数允许将 JSON 文档转换成关系表格形式以便进一步操作。 具体来说,`JSON_TABLE` 接受两个主要参数: - **json_doc**: 表达式的值或列名,表示要被解析的 JSON 文档。 - **path**: 定义了如何访问 JSON 文档内部结构的一个字符串路径表达式。 此外还定义了一组列描述符用来指定输出的结果集格式[^1]。 #### 实际应用案例展示 下面给出一个具体的例子来说明怎样利用 `JSON_TABLE` 来提取特定 ID 的记录: 假设有一个名为 `table_name` 的表内含有字段 `items` 存储着如下所示的一系列 JSON 对象数组: ```json [ {"id": 1}, {"id": 2}, {"id": 3}, ... ] ``` 为了获取其中具有给定ID列表(比如 `[3, 4, 5]`)的所有条目,则可以通过执行以下 SQL 查询语句完成目标: ```sql SELECT * FROM table_name CROSS JOIN JSON_TABLE( items, '$[*]' COLUMNS ( id INT PATH '$.id' ) ) AS j WHERE j.id IN (3, 4, 5); ``` 这段代码首先通过交叉连接 (`CROSS JOIN`) 将原始表与由 `JSON_TABLE` 构建出来的临时视图相结合;接着设置条件过滤只保留那些满足我们需求的数据项。 对于来自 Oracle 转移到 MySQL 上的应用程序而言,在遇到原生支持返回表类型结果集的情况时可能会面临挑战。然而就目前讨论的功能——即把 JSON 数组映射为行集合——MySQL 已经具备良好的解决方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值