我正在尝试由他们创建aggregate function
一个concatenates
数字。grouping
我该怎么办?假设我在下面有一张这样的表格。
Table Numbers
123
145
187
105
我希望结果看起来像
105_123_145_187
如果我在 MySQL 中工作,我知道如何使用group_concat
分隔符。_
我怎样才能在 PostgreSQL 中做到这一点?
我正在尝试由他们创建aggregate function
一个concatenates
数字。grouping
我该怎么办?假设我在下面有一张这样的表格。
Table Numbers
123
145
187
105
我希望结果看起来像
105_123_145_187
如果我在 MySQL 中工作,我知道如何使用group_concat
分隔符。_
我怎样才能在 PostgreSQL 中做到这一点?
已经有这样的功能:
SELECT string_agg(num::text,'_')
FROM Numbers;
详细信息在这里:string_agg。
告诉我,如果您使用 postgresql 8.4 或更早版本。我将向您展示如何将此功能实现为自定义聚合。
UPD 自定义聚合:
CREATE OR REPLACE FUNCTION public.concat_delimited (text, text, text)
RETURNS text AS
$body$
SELECT $1 || (CASE WHEN $1 = '' THEN '' ELSE $3 END) || $2;
$body$
LANGUAGE 'sql'
IMMUTABLE
RETURNS NULL ON NULL INPUT;
CREATE AGGREGATE public.text_concat (text, text)
(
SFUNC = public.concat_delimited,
STYPE = text
);
对于现代 PostgreSQL 使用string_agg(columnname,'_')
.
对于旧版本 8.4 及更高版本,请使用string_to_array(array_agg(columname), '_')
请参阅数组函数和运算符文档。
例子:
regress=> SELECT array_to_string(array_agg(x::text), ', ') FROM generate_series(1,10) x;
array_to_string
-------------------------------
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
(1 row)
始终在您的问题中包含您的 PostgreSQL 版本。
concat_ws(sep text, str "any" [, str "any" [, ...] ])
是您正在寻找的功能。
第一个参数是您的分隔符,NULL 参数被忽略。有关详细信息,请参阅PostgreSQL 手册。
我根本不精通 pgSQL,但编写聚合函数的答案就在那里,请查看pgSQL 手册了解如何编写函数。