Postgres使用string_agg聚合group_concat的别名

时间:2017-02-10 12:38:34

标签: postgresql group-concat

我知道postgres没有group_concat,但我想通过使用string_agg(或任何其他有效的方式)来模拟字符串。

由于无法更改遗留代码,我需要使用名为group_concat的函数。

我该怎么做?

为了它的价值,我还尝试使用常规concat实现group_concat,并在那里遇到错误:

CREATE AGGREGATE group_concat (text) (sfunc = concat, stype=text)

错误:

  

"函数concat(文本,文本)不存在"

1 个答案:

答案 0 :(得分:4)

-- drop aggregate if exists group_concat(text);
CREATE AGGREGATE group_concat(text) (
  SFUNC=textcat,
  STYPE=text
);

select group_concat(x) from unnest('{a,b,c,d}'::text[]) as x;

textcat||运算符内部使用的函数:

CREATE OPERATOR ||(
  PROCEDURE = textcat,
  LEFTARG = text,
  RIGHTARG = text);

<强>更新

将逗号设为分隔符:

--drop aggregate if exists group_concat(text);
--drop function if exists group_concat_trans(text, text);

create or replace function group_concat_trans(text, text)
  returns text
  language sql
  stable as 
$$select concat($1,case when $1 is not null and $2 is not null then ',' end,$2)$$;

create aggregate group_concat(text) (
  sfunc=group_concat_trans,
  stype=text);

select group_concat(x) from unnest(array['a','b','c',null,'d']) as x;
╔══════════════╗
║ group_concat ║
╠══════════════╣
║ a,b,c,d      ║
╚══════════════╝