我在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
我name, nationality
通过使用SELECT DISTINCT ON
以下代码中的子句来汇总列
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
列ids
在another_tbl
。但是,我接到一个不匹配的电话,说Final statement returns character varying instead of
字符variant [] at column 3
。
如果需要文本列,请使用GROUP BY
和聚合函数string_agg()
。
或array_agg()
构造一个数组。
但是放弃现在多余的DISTINCT ON
。
SELECT name, nationality, string_agg(id, ',') AS ids
FROM tbl
GROUP BY 1, 2
ORDER BY 1, 2;
RETURNS
函数定义的子句必须匹配,例如@ozczecho建议:
CREATE FUNCTION f1()
RETURNS TABLE(name text, nationality text, ids text) AS
-- varchar[] for array_agg()
$func$
SELECT t.name, t.nationality, string_agg(t.id, ',') AS ids
FROM tbl t
GROUP BY 1, 2
ORDER BY 1, 2;
$func$ LANGUAGE sql;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句