我正在寻找一种方法来通过查询来连接组中的字段的字符串。例如,我有一个表:
ID COMPANY_ID EMPLOYEE 1 1 Anna 2 1 Bill 3 2 Carol 4 2 Dave
并且我想通过company_id分组,得到像:
COMPANY_ID EMPLOYEE 1 Anna,Bill 2 Carol,Dave
在MysqL中有一个内置函数来做这个group_concat
从Postgresql 9.0开始更新:
原文链接:https://www.f2er.com/postgresql/194039.html最新版本的Postgres(自2010年底开始)具有string_agg(expression,delimiter)
函数,它将完全按照所要求的问题进行,甚至允许您指定分隔符字符串:
SELECT company_id,string_agg(employee,',') FROM mytable GROUP BY company_id;
更新为Postgresql 8.4:
Postgresql 8.4(2009年)引入了the aggregate function array_agg(expression)
,它将值连接到一个数组中。然后可以使用array_to_string()给出所需的结果:
SELECT company_id,array_to_string(array_agg(employee),') FROM mytable GROUP BY company_id;
原始答案(对于8.4之前的Postgresql):
没有内置的聚合函数来连接字符串。看起来这是需要的,但它不是默认设置的一部分。然而,网络搜索揭示了一些手动实现the same example:
CREATE AGGREGATE textcat_all( basetype = text,sfunc = textcat,stype = text,initcond = '' );
Here is the CREATE AGGREGATE
documentation.
为了获得插入在它们之间的“,”,而不是在它们的末尾,你可能想要自己的连接函数,并将其替换为上面的“textcat”。这是一个我放在一起,但没有测试(更新:测试在8.3.12和工作正常):
CREATE FUNCTION commacat(acc text,instr text) RETURNS text AS $$ BEGIN IF acc IS NULL OR acc = '' THEN RETURN instr; ELSE RETURN acc || ',' || instr; END IF; END; $$ LANGUAGE plpgsql;
注意:上面的函数将输出一个逗号,即使该行中的值为null / empty,它输出:
a,b,c,e,g
a,g
CREATE FUNCTION commacat_ignore_nulls(acc text,instr text) RETURNS text AS $$ BEGIN IF acc IS NULL OR acc = '' THEN RETURN instr; ELSIF instr IS NULL OR instr = '' THEN RETURN acc; ELSE RETURN acc || ',' || instr; END IF; END; $$ LANGUAGE plpgsql;