PostgreSQL GROUP BY LOWER()无效

时间:2015-04-24 20:10:35

标签: sql postgresql group-by

我试图在PostgreSQL 9.4.1中使用GROUP BY而没有像我希望的那样成功。

several folks上有the web声称这应该有效,但我无法获得相同的结果。我想要的只是一个不区分大小写的GROUP BY,但每次我添加LOWER()时都抱怨:

  

错误:专栏" people.fn"必须出现在GROUP BY子句中或者是   用于聚合函数

CREATE DATABASE TEST;
CREATE TABLE people (id INTEGER, fn TEXT, ln TEXT); /* ID, firstname, lastname */

INSERT INTO people (id, fn, ln) VALUES(1,'Mike','f');
INSERT INTO people (id, fn, ln) VALUES(2,'adam','b');
INSERT INTO people (id, fn, ln) VALUES(3,'bill','b');
INSERT INTO people (id, fn, ln) VALUES(4,'Bill','r');
INSERT INTO people (id, fn, ln) VALUES(5,'mike','d');
INSERT INTO people (id, fn, ln) VALUES(6,'mike','c');
INSERT INTO people (id, fn, ln) VALUES(7,'Mike','T');

SELECT fn FROM people GROUP BY LOWER(fn);  /* will not run */
SELECT fn FROM people GROUP BY fn;  /* runs, but not what I want */

这是我得到的:

adam
mike
Mike
bill
Bill

这就是我想要的:

Mike
adam
bill

显然,我缺少了一些东西。不,我不能在将数据放入数据库时​​对数据进行清理。我应该阅读什么来理解这一点?

1 个答案:

答案 0 :(得分:4)

通常,如果要在聚合查询中选择某些内容,则必须按此分组""。在您的情况下,您可以选择lower(fn)

来获得所需的结果
select lower(fn)
from people
group by lower(fn)

幸运的是,PostgreSQL允许您按别名分组,因此您不必重复lower(fn)两次:

select lower(fn) as lfn
from people
group by lfn

<强> sql fiddle demo

正如@okaram在评论中提到的,如果您不需要在桌面上进行任何其他侵害,您最好使用distinct

select distinct lower(fn)
from people