sql - “ORDER BY”表达式中的列别名?
问题描述
在 Oracle 12.1.0.2 和 Oracle 19c 中,此查询:
with test_data (c1, c2) AS (
SELECT 'A', 1 FROM DUAL UNION ALL
SELECT 'B', 2 FROM DUAL UNION ALL
SELECT 'C', 3 FROM DUAL )
SELECT c1, c2*-1 c2
FROM test_data
order by c2*-1;
回报:
+----+----+ | C1 | C2 | +----+----+ | A | -1 | | B | -2 | | C | -3 | +----+----+
换句话说,c2
inORDER BY c2*-1
指的c2
是 SELECT 列表中的列别名,而不是c2
数据库表中的列。
我对Oracle SQL 参考指南的阅读使我认为上面的查询结果是不正确的,Oracle 认为ORDER BY
表达式中的标识符引用列别名是不合适的。
Oracle 是否一直都是这样,而我却从未注意到?Oracle 的文档中是否有某些内容表明上述结果是正确且符合预期的?
解决方案
文档对我来说似乎很清楚:
表达式
expr 根据 expr 的值对行进行排序。该表达式基于选择列表中的列或 FROM 子句中的表、视图或实例化视图中的列。
它实际上首先引用了选择列表中的“列”(这意味着别名)。
如果您想要表格列,请使用别名:
order by test_data.c2 * -1
推荐阅读
- firebase - 如何在 Cloud Firestore 上的文档数组中添加值?
- python - 我应该将所有自定义异常包含在一个文件中吗?
- javascript - 如何在脚本中定义函数?
- react-native - v2 Navigation.showModal 创建新组件实例但实际上并未导航到它
- terminal - Git bash:找不到whereis命令
- video - 是否可以在相同大小(就数据而言)块上分割视频?
- dart - 如何在颤动中创建可滚动的日期选择器?
- jquery - 如何使用 jQuery 将多个单选按钮选项保存为变量?
- sql-server - 它总是返回 0 的数量而不是计算的函数
- android - Flutter 问题 cloud-firestore 依赖