2012-04-08 34 views
1

这并不在Postgres的8.4工作:SQL错误/低

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

但这个工程:

SELECT DISTINCT col1 FROM mytable 
    ORDER BY col1; 

我知道这可能是数据库有点混乱是先应用DISTINCT再用UPPER还是首先应用UPPER然后应用DISTINCT。根据订单如何应用,可能会得到不同的结果。不确定SQL标准在这方面是否有任何说明。

任何帮助将不胜感激。

+0

你收到了什么错误信息?如果这是我的想法,你可能可以使用这个查询 - SELECT DISTINCT UPPER(col1),col1 FROM mytable ORDER BY UPPER(col1); – 2012-04-08 14:30:36

+0

我得到的错误是:错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中 – user1318538 2012-04-08 20:48:27

+0

但您的解决方案工作!谢谢。 – user1318538 2012-04-08 20:49:10

回答

3

许多SQL引擎只允许您对正在选择的列进行排序。所以修正将UPPER(col1)添加到select。

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

['DISTINCT'子句](http://www.postgresql.org/docs/current/interactive/sql-select.html#SQL-DISTINCT)和'ORDER BY'必须同意**最左边的**列。在许多情况下添加* additional *'ORDER BY'列是很好用的。 – 2012-04-09 21:22:31

0

在同样的问题,只是迷迷糊糊地在我的特殊背景下,以下是简单的来实现:

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

我没有刻意做任何性能测试(在我的情况下,数据量相当低),但这可能甚至可能会提高速度,因为排序可能发生在少得多的数据上(Postgres doc说排序在应用DISTINCT之前发生,而上面我们先DISTINCT,然后排序)。