为什么在ORDER BY中“输出列名称必须独立存在,即不能在表达式中使用”?

时间:2018-06-24 22:07:11

标签: postgresql

在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为什么不正确?

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

谢谢。

1 个答案:

答案 0 :(得分:1)

如果table1有一个名为sum的列,则不明确。如果没有该规则,解析器将不得不为每个名称考虑它是列名称还是表达式别名。按照规则,仅需考虑名称是否独立。因此,该规则可减少歧义。