Postgres 的 string_agg(expr, delimiter) 函数很棒。但我希望有一个版本,它采用单个参数 - 要聚合的字段 - 并假设分隔符为 ', ',因为这是我想要的 9 次(10 次)。使用非聚合函数,我可以只需这样做:
create or replace function public.string_agg(text)
returns text
as $$
select string_agg($1, ', ');
$$ language sql
immutable;
但是由于 string_agg 是一个聚合函数,所以这是行不通的。它抱怨我传递给它的字段需要在 GROUP BY 子句中,这告诉我查询引擎不明白我的包装器是一个聚合函数。
我查看了用户定义聚合的文档(http://www.postgresql.org/docs/9.1/static/xaggr.html 和http://www.postgresql.org/docs/9.1/static/sql-createaggregate .html ),但对我来说如何使用现有的 string_agg(text, text) 定义我的新 string_agg(text) 并不明显。看来我必须从头开始定义我的新函数,这比我想承担的要复杂得多,而且我也不完全相信我可以完美地反映内置 string_agg 的行为。
那么是否有一些技术可以创建一个比我没有看到的简单包装器?还是我必须做更多的工作?
据我所知,您不能包装聚合函数。您必须编写自己的聚合函数。
如果您编写自己的函数,则在升级或移植到另一个数据库时可能会遇到不兼容问题。因此,就个人而言,我不会打扰,只需
string_agg()
在每次通话中添加分隔符即可。真的没有那么痛苦。也就是说,编写自己的聚合函数也不是那么复杂:
自定义最终功能:
汇总:
称呼:
适用于几乎任何类型 - 除了数组类型。您将不得不为此修改您的聚合。更多关于 SO 的密切相关的答案。