我正在寻找一种方法,通过查询连接组内字段的字符串。例如,我有一个表格:

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


当前回答

下面是关于字符串连接的自定义聚合函数的使用:你需要记住,select语句将以任意顺序排列行,所以你需要在from语句中使用order by子句执行子选择,然后使用group by子句执行外层选择来聚合字符串,这样:

SELECT custom_aggregate(MY.special_strings)
FROM (SELECT special_strings, grouping_column 
        FROM a_table 
        ORDER BY ordering_column) MY
GROUP BY MY.grouping_column

其他回答

如前所述,创建自己的聚合函数是正确的做法。下面是我的拼接聚合函数(你可以在法语中找到详细信息):

CREATE OR REPLACE FUNCTION concat2(text, text) RETURNS text AS '
    SELECT CASE WHEN $1 IS NULL OR $1 = \'\' THEN $2
            WHEN $2 IS NULL OR $2 = \'\' THEN $1
            ELSE $1 || \' / \' || $2
            END; 
'
 LANGUAGE SQL;

CREATE AGGREGATE concatenate (
  sfunc = concat2,
  basetype = text,
  stype = text,
  initcond = ''

);

然后把它用作:

SELECT company_id, concatenate(employee) AS employees FROM ...

使用Postgres文档继续Kev的回答:

首先,创建一个元素数组,然后使用内置的array_to_string函数。

CREATE AGGREGATE array_accum (anyelement)
(
 sfunc = array_append,
 stype = anyarray,
 initcond = '{}'
);

select array_to_string(array_accum(name),'|') from table group by id;

如果你要升级到8.4,这个最新的公告列表片段可能会感兴趣:

直到8.4推出 超级高效的本地一个,你可以添加 类中的array_accum()函数 用于滚动的PostgreSQL文档 将任何列放入数组,这可以 然后被应用程序代码使用,或者 结合array_to_string()来 将其格式化为列表: http://www.postgresql.org/docs/current/static/xaggr.html

我想链接到8.4的开发文档,但他们似乎还没有列出这个功能。

下面是关于字符串连接的自定义聚合函数的使用:你需要记住,select语句将以任意顺序排列行,所以你需要在from语句中使用order by子句执行子选择,然后使用group by子句执行外层选择来聚合字符串,这样:

SELECT custom_aggregate(MY.special_strings)
FROM (SELECT special_strings, grouping_column 
        FROM a_table 
        ORDER BY ordering_column) MY
GROUP BY MY.grouping_column

如何使用Postgres内置数组函数?至少在8.4中,这是开箱即用的:

SELECT company_id, array_to_string(array_agg(employee), ',')
FROM mytable
GROUP BY company_id;