【发布时间】:2013-11-20 12:30:58
【问题描述】:
我在 MacOSX 上使用 Postgres 9.3。
我想知道如何返回多个值(取决于某些标准)并使用它们以类似列表/数组的方式填充列?
--DUMMY DATA
CREATE TABLE tbl (
id VARCHAR(2) PRIMARY KEY
,name TEXT
,year_born NUMERIC
,nationality TEXT
);
INSERT INTO tbl(id, name, year_born, nationality)
VALUES ('A1','Bill',2001,'American')
,('B1','Anna',1997,'Swedish')
,('A2','Bill',1991,'American')
,('B2','Anna',2004,'Swedish')
,('B3','Anna',1989,'Swedish')
,('A3','Bill',1995,'American');
SELECT * FROM tbl;
id | name | year_born | nationality
---+------+-----------+------------
A1 | Bill | 2001 | American
B1 | Anna | 1997 | Swedish
A2 | Bill | 1991 | American
B2 | Anna | 2004 | Swedish
B3 | Anna | 1989 | Swedish
A3 | Bill | 1995 | American
我使用SELECT DISTINCT ON 子句在name, nationality 列上汇集,如下面的代码所示
CREATE TABLE another_tbl ( name TEXT, nationality TEXT, ids VARCHAR );
CREATE FUNCTION f1() RETURNS SETOF another_tbl AS
$$ SELECT DISTINCT ON (name, nationality) name, nationality, id
FROM tbl
GROUP BY name, nationality, ID;
$$ LANGUAGE sql
SELECT * FROM f1();
name | nationality | ids
------+-------------+-----
Anna | Swedish | B1
Bill | American | A1
所以,这是我不知道如何实现的事情,但我认为这很容易。我希望 ids 列由与 name 列中的名称对应的所有 id 填充,如下所示。
期望的输出:
SELECT * FROM f1();
name | nationality | ids
------+-------------+-----
Anna | Swedish | B1, B2, B3
Bill | American | A1, A2, A3
更新
发现了ARRAY,我将它与VARCHAR 类一起用于another_tbl 中的ids 列。但是,我接到一个不匹配的电话,说Final statement returns character varying instead ofcharacter varying[]at column 3。
【问题讨论】:
标签: sql list postgresql distinct aggregate-functions