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

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


当前回答

我使用Jetbrains Rider,从上面的例子中复制结果并重新执行是一件麻烦的事情,因为它似乎将所有内容都包装在JSON中。这将它们连接到一个更容易运行的语句中

select string_agg('drop table if exists "' || tablename || '" cascade', ';') 
from pg_tables where schemaname != $$pg_catalog$$ and tableName like $$rm_%$$

其他回答

根据PostgreSQL 9.0及以上版本,你可以使用名为string_agg的聚合函数。你的新SQL应该看起来像这样:

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

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

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 ...

如果您使用的是Amazon Redshift,不支持string_agg,请尝试使用listagg。

SELECT company_id, listagg(EMPLOYEE, ', ') as employees
FROM EMPLOYEE_table
GROUP BY company_id;

我使用Jetbrains Rider,从上面的例子中复制结果并重新执行是一件麻烦的事情,因为它似乎将所有内容都包装在JSON中。这将它们连接到一个更容易运行的语句中

select string_agg('drop table if exists "' || tablename || '" cascade', ';') 
from pg_tables where schemaname != $$pg_catalog$$ and tableName like $$rm_%$$

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

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