group_concat 使用 string_agg 的 Postgres 聚合别名
Postgres aggregate alias for group_concat using string_agg
我知道 postgres 没有 group_concat,但我想通过使用 string_agg(或任何其他可行的方式)为字符串模拟它。
我需要一个名为 group_concat 的函数,因为无法更改遗留代码。
我该怎么做?
为了它的价值,我还尝试使用常规 concat 实现 group_concat
,并且 运行 也出现错误:
CREATE AGGREGATE group_concat (text) (sfunc = concat, stype=text)
错误:
"function concat(text,text) does not exist"
-- 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(,case when is not null and is not null then ',' end,)$$;
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 ║
╚══════════════╝
我知道 postgres 没有 group_concat,但我想通过使用 string_agg(或任何其他可行的方式)为字符串模拟它。
我需要一个名为 group_concat 的函数,因为无法更改遗留代码。
我该怎么做?
为了它的价值,我还尝试使用常规 concat 实现 group_concat
,并且 运行 也出现错误:
CREATE AGGREGATE group_concat (text) (sfunc = concat, stype=text)
错误:
"function concat(text,text) does not exist"
-- 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(,case when is not null and is not null then ',' end,)$$;
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 ║ ╚══════════════╝