在关系型数据库的实际使用中,越来越多的业务场景会把半结构化的JSON数据直接存储到表的字段里,比如用户的扩展属性、商品的动态规格信息等。这类数据如果用传统的关系型查询方式处理,很难直接提取其中的嵌套字段,而JSON_TABLE函数的出现很好地解决了这个问题,它可以将JSON格式的数据转换为标准的关系型行集,再和常规的结构化查询语句配合使用,实现复杂数据的灵活解析。

JSON_TABLE基本语法说明
JSON_TABLE的核心作用是将JSON文本按照指定的路径解析,生成包含多行多列的关系型结果集,基本语法结构如下:
JSON_TABLE(
待解析的JSON表达式,
JSON路径 ON [ERROR|EMPTY] [ACTION] -- 指定JSON数据的解析路径
COLUMNS (
列名1 数据类型 PATH 'JSON路径1' [处理规则],
列名2 数据类型 PATH 'JSON路径2' [处理规则],
...
)
) AS 别名
其中待解析的JSON表达式可以是表中的JSON类型字段,也可以是字符串形式的JSON数据;JSON路径遵循JSON路径规范,用来定位需要提取的JSON节点;COLUMNS子句用来定义转换后的关系型列的属性,包括列名、数据类型、对应的JSON路径等。
JSON_TABLE与基础结构化查询结合
结合WHERE子句过滤数据
我们可以先通过JSON_TABLE解析JSON字段,再用WHERE子句过滤解析后的结果,示例如下,假设有一张用户表user_info,其中ext_attr字段存储用户的扩展JSON属性:
-- 查询所有年龄大于18岁的用户的基础信息和扩展属性中的年龄
SELECT
u.user_id,
u.user_name,
jt.user_age
FROM user_info u
CROSS JOIN JSON_TABLE(
u.ext_attr,
'$.ext' COLUMNS (
user_age INT PATH '$.age'
)
) AS jt
WHERE jt.user_age > 18
上面的查询中,先通过JSON_TABLE把ext_attr字段里的age属性提取为user_age列,再用WHERE条件过滤出年龄大于18岁的用户数据。
结合GROUP BY子句做聚合统计
JSON_TABLE也可以和GROUP BY配合,对解析后的JSON数据做聚合计算,比如统计不同城市的用户数量:
-- 统计每个城市的用户数量
SELECT
jt.city,
COUNT(*) AS user_count
FROM user_info u
CROSS JOIN JSON_TABLE(
u.ext_attr,
'$.ext' COLUMNS (
city VARCHAR(50) PATH '$.city'
)
) AS jt
GROUP BY jt.city
ORDER BY user_count DESC
JSON_TABLE与多表关联查询结合
当解析后的JSON数据需要和其他表做关联时,也可以直接把JSON_TABLE的结果作为临时结果集参与JOIN操作,比如有一张城市信息表city_info,存储城市的编码和名称,我们可以通过JSON_TABLE提取用户所在城市编码,再和城市表关联获取城市名称:
-- 关联城市表获取用户所在城市的完整名称
SELECT
u.user_id,
u.user_name,
ci.city_name
FROM user_info u
CROSS JOIN JSON_TABLE(
u.ext_attr,
'$.ext' COLUMNS (
city_code VARCHAR(20) PATH '$.city_code'
)
) AS jt
LEFT JOIN city_info ci ON jt.city_code = ci.city_code
不同数据库中的使用差异
虽然JSON_TABLE是SQL标准函数,但不同数据库的具体实现略有差异,以下是常见数据库的使用注意点:
| 数据库类型 | 使用注意点 |
|---|---|
| MySQL | 需要MySQL 8.0及以上版本支持,JSON路径需要用单引号包裹,解析数组时可以用$[*]路径 |
| PostgreSQL | 需要PostgreSQL 12及以上版本支持,JSON路径使用jsonb_path_query相关语法,数据类型需要匹配JSON字段的实际类型 |
| Oracle | 12c及以上版本支持,支持更多错误处理选项,比如ON ERROR可以指定解析错误时的处理方式 |
使用注意事项
- JSON路径必须正确匹配JSON数据的结构,否则会返回空结果或者报错,建议先单独验证JSON路径的正确性
- 如果JSON字段可能为NULL或者格式不合法,需要添加对应的错误处理规则,避免查询直接失败
- 大量使用JSON_TABLE解析数据可能会影响查询性能,对于高频查询的JSON属性,建议考虑冗余存储为普通列
总结
JSON_TABLE为关系型数据库处理JSON半结构化数据提供了标准化的解决方案,通过它可以将JSON数据转换为关系型行集,再和WHERE、GROUP BY、JOIN等结构化查询子句无缝结合,实现复杂数据的灵活查询和统计。开发者只需要掌握基本的语法规则,结合实际的业务场景调整解析路径和查询逻辑,就可以高效处理存储在数据库中的JSON数据,不需要额外做数据导出解析的操作。
SQLJSON_TABLE结构化查询数据解析修改时间:2026-07-05 10:42:27