Oracle中json_table查询返回行顺序是否与JSON数组元素顺序一致?
JSON_TABLE展开JSON数组的返回顺序说明
- 在主流支持
JSON_TABLE的数据库(MySQL 8.0+、Oracle 12c+、PostgreSQL 12+等)的当前常规实现中,你写的这条不带ORDER BY的语句,大多数执行场景下返回的行顺序会和JSON数组内的元素顺序保持一致。 - 但从SQL规范和实际稳定性角度出发:没有显式
ORDER BY子句的查询,数据库不承诺返回结果的固定顺序。以下场景都可能导致返回顺序和数组原生顺序不一致:- 优化器调整执行计划,比如触发并行执行、分布式查询、JSON_TABLE相关的执行逻辑在版本迭代中调整
- 查询增加了多表关联、嵌套JSON解析、后置过滤等逻辑后,优化器可能调整结果返回的顺序
- 如果你的业务逻辑强依赖数组元素的原有顺序,必须做显式排序处理,不要依赖隐式的返回顺序。
可靠保序的实现方式
最稳妥的方案是在JSON_TABLE的列定义中增加FOR ORDINALITY类型的序号列,这个列会自动按照元素在JSON数组中的位置生成从1开始的连续序号,最终查询时按这个序号排序即可,不存在顺序错乱的风险。修改后的示例代码如下:
select t.* from mytable m, json_table (m.json_col,'$.arr[*]' columns( arr_seq FOR ORDINALITY, -- 绑定数组元素位置的序号列 ... -- 保留你原有的其他列定义 ) t where m.id = 1 order by t.arr_seq; -- 显式按数组元素位置排序
注意:不要依赖物理存储位置、主键等其他字段做排序,只有
FOR ORDINALITY生成的序号是和JSON数组元素位置强绑定的,是保序的唯一可靠方案。
内容的提问来源于stack exchange,提问作者Andrew Klimov
相关产品推荐
相关产品推荐

