1

我正在尝试由他们创建aggregate function一个concatenates数字。grouping我该怎么办?假设我在下面有一张这样的表格。

Table Numbers
123
145
187
105

我希望结果看起来像

105_123_145_187

如果我在 MySQL 中工作,我知道如何使用group_concat分隔符。_

我怎样才能在 PostgreSQL 中做到这一点?

4

3 回答 3

3

已经有这样的功能:

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
);
于 2012-12-13T13:42:42.147 回答
1

对于现代 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 版本。

于 2012-12-14T00:45:45.407 回答
-3

concat_ws(sep text, str "any" [, str "any" [, ...] ])是您正在寻找的功能。

第一个参数是您的分隔符,NULL 参数被忽略。有关详细信息,请参阅PostgreSQL 手册

我根本不精通 pgSQL,但编写聚合函数的答案就在那里,请查看pgSQL 手册了解如何编写函数。

于 2012-12-13T13:30:55.707 回答