PostgreSQL GROUP BY LOWER() 不工作
PostgreSQL GROUP BY LOWER() not working
我正在尝试在 PostgreSQL 9.4.1 中使用 GROUP BY
,但没有像我希望的那样成功。
several folks on the web 人声称这应该有效,但我得不到相同的结果。我想要的只是一个不区分大小写的 GROUP BY
但每次我添加 LOWER()
它都会抱怨:
ERROR: column "people.fn" must appear in the GROUP BY clause or be
used in an aggregate function
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
显然,我缺少一些东西。不,我不能在将数据放入数据库时就对其进行清理。我应该读什么来理解这个?
一般来说,如果您想 select 聚合查询中的某些内容,则必须按此 "something" 进行分组。在您的情况下,您可以通过 selecting lower(fn)
:
获得您想要的结果
select lower(fn)
from people
group by lower(fn)
幸运的是,PostgreSQL 允许您按别名分组,因此您不必重复 lower(fn)
两次:
select lower(fn) as lfn
from people
group by lfn
正如@okaram 在评论中提到的,如果您不需要 table 上的任何其他聚合,您最好使用 distinct
:
select distinct lower(fn)
from people
我正在尝试在 PostgreSQL 9.4.1 中使用 GROUP BY
,但没有像我希望的那样成功。
several folks on the web 人声称这应该有效,但我得不到相同的结果。我想要的只是一个不区分大小写的 GROUP BY
但每次我添加 LOWER()
它都会抱怨:
ERROR: column "people.fn" must appear in the GROUP BY clause or be used in an aggregate function
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
显然,我缺少一些东西。不,我不能在将数据放入数据库时就对其进行清理。我应该读什么来理解这个?
一般来说,如果您想 select 聚合查询中的某些内容,则必须按此 "something" 进行分组。在您的情况下,您可以通过 selecting lower(fn)
:
select lower(fn)
from people
group by lower(fn)
幸运的是,PostgreSQL 允许您按别名分组,因此您不必重复 lower(fn)
两次:
select lower(fn) as lfn
from people
group by lfn
正如@okaram 在评论中提到的,如果您不需要 table 上的任何其他聚合,您最好使用 distinct
:
select distinct lower(fn)
from people