postgresql - 为什么在 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
最后一个例子是错误的?
最后一个例子可以提供什么歧义?
谢谢。
解决方案
如果table1
有一个名为 的列,则存在歧义sum
。如果没有该规则,解析器将不得不考虑每个名称是列名还是表达式别名。根据规则,它只需要考虑名称是否独立。因此,该规则减少了歧义。
推荐阅读
- php - 具有 2 个表的身份验证类
- javascript - 使用 PHP 而不是 JavaScript 的 Firebase 电话身份验证
- google-apps-script - 谷歌应用脚本提取数据并在表格中注册电子邮件
- python - 如何根据行值从熊猫数据框中删除一行
- django - 默认值在表单集中不起作用 - django
- raspberry-pi - 在电路python中获取USB鼠标单击和光标位置
- javascript - 如何使用 jquery 获取页面上的值并使用 php 将其回显到页面上
- excel - 用于将来自多个工作簿中的多个表的数据附加到数据模型中的 VBA 代码
- android - 一起滚动两个懒惰的滚动条
- bash - 括号内的语句 [ ] 是什么意思