首页/数据/SQL 速查/展开 JSON 数组为多行(JSON_TABLE 与 LATERAL)

展开 JSON 数组为多行(JSON_TABLE 与 LATERAL)

把一行里的 JSON 数组拆成多行参与过滤与统计:MySQL 8 用 JSON_TABLE,PostgreSQL 用 jsonb_array_elements 配合 LATERAL。

SQL 速查数据更新于 2026-10-12

MySQL 8

MySQL 8
SELECT o.id, jt.tag
FROM orders o,
     JSON_TABLE(o.tags, '$[*]'
                COLUMNS (tag VARCHAR(64) PATH '$')) AS jt
WHERE jt.tag = 'vip';

PostgreSQL

PostgreSQL
SELECT o.id, t.tag
FROM orders o
CROSS JOIN LATERAL jsonb_array_elements_text(o.tags) AS t(tag)
WHERE t.tag = 'vip';
MySQLJSON_TABLE 把 JSON 文档转成行集
PostgreSQLjsonb_array_elements_text 是集合返回函数,配合 LATERAL
用途标签检索、明细展开、JSON 去规范化数据

易错点

  • JSON 列内的字段检索通常不能用普通索引,高频查询考虑拆表或生成列加索引
  • 展开后行数由数组长度决定,聚合口径会从“订单”变成“标签行”

数据来源与参考

  • MySQL 8.0 Reference Manual · JSON_TABLE
  • PostgreSQL Documentation · JSON Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌