首页 > 解决方案 > “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 |
+----+----+

换句话说,c2inORDER BY c2*-1指的c2是 SELECT 列表中的列别名,而不是c2数据库表中的列。

我对Oracle SQL 参考指南的阅读使我认为上面的查询结果是不正确的,Oracle 认为ORDER BY表达式中的标识符引用列别名是不合适的。

Oracle 是否一直都是这样,而我却从未注意到?Oracle 的文档中是否有某些内容表明上述结果是正确且符合预期的?

标签: sqloraclesql-order-by

解决方案


文档对我来说似乎很清楚:

表达式

expr 根据 expr 的值对行进行排序。该表达式基于选择列表中的列或 FROM 子句中的表、视图或实例化视图中的列。

它实际上首先引用了选择列表中的“列”(这意味着别名)。

如果您想要表格列,请使用别名:

order by test_data.c2 * -1

推荐阅读