使用上/下不同顺序时出现SQL错误

使用上/下不同顺序时出现SQL错误,sql,postgresql,Sql,Postgresql,这在postgres 8.4中不起作用: SELECT DISTINCT col1 FROM mytable ORDER BY UPPER(col1); 但这是可行的: SELECT DISTINCT col1 FROM mytable ORDER BY col1; 我知道,对于数据库来说,是先应用DISTINCT然后再应用UPPER,还是先转换为UPPER然后再应用DISTINCT,可能会有点混淆。根据其应用的顺序,可能会得到不同的结果。不确定SQL标准是否在这方面有所说明 非常感

这在postgres 8.4中不起作用:

SELECT DISTINCT col1 FROM mytable
  ORDER BY UPPER(col1);
但这是可行的:

SELECT DISTINCT col1 FROM mytable
  ORDER BY col1;
我知道,对于数据库来说,是先应用DISTINCT然后再应用UPPER,还是先转换为UPPER然后再应用DISTINCT,可能会有点混淆。根据其应用的顺序,可能会得到不同的结果。不确定SQL标准是否在这方面有所说明


非常感谢您的帮助。

许多SQL引擎只允许您对所选列进行排序。因此,修复程序将上限(col1)添加到select

SELECT DISTINCT UPPER(col1), col1 FROM mytable ORDER BY UPPER(col1)

只是偶然发现了相同的问题,在我的特定环境中,以下内容更容易实现:

select * from (select distinct col1 from mytable) x order by upper(col1)

我没有费心做任何性能测试(在我的情况下,数据量相当低),但这可能会提高速度,因为排序可能会在更少的数据上进行(Postgres doc说排序在应用DISTINCT之前进行,而上面的方法是先进行DISTINCT,然后进行排序)。

您收到了什么错误消息?如果它是我所认为的,那么您可能能够使用这个查询——从MyTableOrder BY UPPER(col1)中选择DISTINCT UPPER(col1),col1;我得到的错误是:错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中,但您的解决方案有效!谢谢。@BrianHoover:我想你应该把你的评论作为答案发布,这样OP就可以接受了。这显然解决了OP的问题。@ErwinBrandstetter-感谢提醒和
orderby
必须在最左边的列上达成一致。在许多情况下,添加额外的ORDER BY列是可以使用的。