首页 > 解决方案 > 为什么在 ORDER BY 中“输出列名必须独立,即不能在表达式中使用”?

问题描述

在 PostgreSQL 的文档中

ORDER BY 子句指定排序顺序:

SELECT select_list
    FROM table_expression
    ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }]
             [, sort_expression2 [ASC | DESC] [NULLS { FIRST |
 LAST }] ...]

排序表达式可以是在查询的选择列表中有效的任何表达式。一个例子是:

SELECT a, b FROM table1 ORDER BY a + b, c;

...

sort_expression 也可以是列标签或输出列的编号,如下所示:

SELECT a + b AS sum, c FROM table1 ORDER BY sum;
SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;

两者都按第一个输出列排序。请注意,输出列名必须是独立的,也就是说,它不能在表达式中使用——例如,这是不正确的:

SELECT a + b AS sum, c FROM table1 ORDER BY sum + c;          -- wrong

这个限制是为了减少歧义。如果 ORDER BY 项是可以匹配输出列名称或表表达式中的列的简单名称,则仍然存在歧义。在这种情况下使用输出列。如果您使用 AS 重命名输出列以匹配其他表列的名称,这只会引起混淆。

有人能解释一下“输出列名必须独立,即不能在表达式中使用”是什么意思吗?

为什么ORDER BY a+b第一个例子是正确的,而ORDER BY sum+c最后一个例子是错误的?

最后一个例子可以提供什么歧义?

谢谢。

标签: postgresql

解决方案


如果table1有一个名为 的列,则存在歧义sum。如果没有该规则,解析器将不得不考虑每个名称是列名还是表达式别名。根据规则,它只需要考虑名称是否独立。因此,该规则减少了歧义。


推荐阅读