PostgreSQL GROUP BY LOWER()无法正常工作

kmo*_*ort 5 sql postgresql group-by

我正在尝试GROUP BY在PostgreSQL 9.4.1中使用,但没有获得我希望的成功。

几个人网上声称这应该工作,但我不能得到相同的结果。我想要的是不区分大小写的,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 */
Run Code Online (Sandbox Code Playgroud)

这是我得到的:

adam
mike
Mike
bill
Bill
Run Code Online (Sandbox Code Playgroud)

这就是我想要的:

Mike
adam
bill
Run Code Online (Sandbox Code Playgroud)

显然,我缺少一些东西。不,我不能只是将数据放入数据库中清理数据。我应该读什么才能理解这一点?

Rom*_*kar 7

通常,如果要在聚合查询中选择某项,则必须按此“某项”进行分组。就您而言,您可以通过选择来获得所需的结果lower(fn)

select lower(fn)
from people
group by lower(fn)
Run Code Online (Sandbox Code Playgroud)

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

select lower(fn) as lfn
from people
group by lfn
Run Code Online (Sandbox Code Playgroud)

sql fiddle demo

正如@okaram在评论中提到的那样,如果您不需要桌上的任何其他聚集,则最好使用distinct

select distinct lower(fn)
from people
Run Code Online (Sandbox Code Playgroud)