sql标准不存在“2016版”,真正首个系统性定义json支持的是sql:2023,其核心新增json_table、统一json路径语法及显式错误处理机制;sql server 2016等厂商实现均为私有扩展,不兼容标准。

SQL 标准本身没有“2016 版”——SQL:2016 并不存在,你实际遇到的很可能是 SQL Server 2016 实现的 JSON 函数,或误将 MySQL 5.7(发布于 2015 年底,常被关联到 2016)当作标准版本。真正的国际标准是 SQL:2016 之后的 SQL:2016 未发布,下一个是 SQL:2016 的后续是 SQL:2016?不,是 SQL:2016 未被采纳,直接跳到了 SQL:2016?错。标准序列是 SQL:1999 → SQL:2003 → SQL:2008 → SQL:2011 → SQL:2016?不,SQL:2016 也不存在。最新已发布标准是 SQL:2023。
也就是说:不存在「SQL 标准 2016」这一版,更不存在其 JSON 函数规范。所有你在 SQL Server 2016、MySQL 5.7 或 PostgreSQL 9.4+ 中用到的 JSON 功能,都是各厂商对 JSON 的**各自实现**,并非来自某个叫 “SQL:2016” 的标准。真正首次在 SQL 标准中系统性定义 JSON 支持的,是 SQL:2023。
SQL Server 2016 的 JSON 函数不是标准,而是微软私有实现
SQL Server 2016 引入了 JSON_VALUE、JSON_QUERY、ISJSON、OPENJSON 等函数,但它们:
- 语法与行为不兼容其他数据库(比如
JSON_VALUE第二个参数必须是字符串路径,而 SQL:2023 允许变量或表达式) - 不支持路径通配符(如
$..name)、数组展开(json_array_elements类语义)等标准能力 - 没有标准化的错误处理机制——
JSON_VALUE遇到缺失路径默认返回 NULL,无法配置为报错或返回默认值 -
OPENJSON返回的是固定 schema 表,不能像 SQL:2023 的JSON_TABLE那样动态推导列类型和 nullability
SQL:2023 的 JSON 函数核心新增:JSON_TABLE 和统一路径语法
SQL:2023 正式将 JSON 操作纳入标准,关键新增包括:
-
JSON_TABLE:标准语法,将 JSON 数组/对象映射为关系表,支持嵌套COLUMNS子句定义列名、类型、路径及ON ERROR/ON EMPTY处理策略 - 统一 JSON 路径语言(
json_path):基于 ISO/IEC TR 19179-1:2021,支持$、.*、.[*]、.[0 to 2]等标准写法,跨数据库可移植 -
JSON_OBJECT和JSON_ARRAY增加ABSENT ON NULL/NULL ON NULL显式控制策略,消除歧义 - 所有 JSON 函数(
JSON_VALUE、JSON_QUERY等)要求明确声明返回类型,并支持ERROR ON ERROR报错模式(而非静默 NULL)
MySQL 5.7/8.0 和 PostgreSQL 的 JSON 支持离 SQL:2023 还差什么
MySQL 8.0 的 JSON_TABLE 是最接近标准的实现,但仍有差异:
- 不支持
ON ERROR DEFAULT 'N/A'这类带默认值的错误处理,只支持NULL ON ERROR或ERROR ON ERROR - 路径表达式不支持范围索引(如
[0 to 2]),仅支持[0,1,2]列表或[*] -
JSON_OBJECTAGG不支持ABSENT ON NULL,会把 NULL 键值对保留为"key": null
PostgreSQL 的 jsonb 功能强大,但原生无 JSON_TABLE;需靠 jsonb_to_recordset() + CTE 模拟,且路径语法用 #> / #>>,与标准不兼容。
实际开发中怎么选路径
如果你需要跨数据库可移植的 JSON 查询逻辑:
- 避免依赖
OPENJSON或json_extract_path_text这类厂商专属函数 - 优先用
JSON_TABLE(若目标 DB 支持,如 MySQL 8.0.4+、Oracle 23c) - 路径写法坚持用
$.user.name而非'$.user.name'字符串字面量(后者是 SQL Server 写法,非标准) - 对缺失字段的处理,显式写
ON EMPTY NULL,而不是依赖隐式行为
真正麻烦的不是函数有没有,而是同一段 JSON 查询逻辑,在 SQL Server、MySQL、PostgreSQL 上往往要重写三遍——因为它们根本没按同一个标准实现。SQL:2023 提供了统一蓝图,但落地仍需时间。











