加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:57:06 所属栏目:百科 来源:网络整理
导读:我正在寻找一种方法来通过查询来连接组中的字段的字符串。例如,我有一个表: ID COMPANY_ID EMPLOYEE1 1 Anna2 1 Bill3 2 Carol4 2 Dave 并且我想通过company_id分组,得到像: COMPANY_ID EMPLOYEE1 Anna,Bill2 Carol,Dave 在mySQL中有一个内置函数来做这
我正在寻找一种方法来通过查询来连接组中的字段的字符串。例如,我有一个表:
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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读