如何通过’query’连接PostgreSQL组中的字符串字符串?

前端之家收集整理的这篇文章主要介绍了如何通过’query’连接PostgreSQL组中的字符串字符串?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找一种方法来通过查询来连接组中的字段的字符串。例如,我有一个表:
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开始更新:

最新版本的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

只需添加一个ELSIF检查到函数

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;
原文链接:https://www.f2er.com/postgresql/194039.html

猜你在找的Postgre SQL相关文章