在PostgreSQL中连接属性

时间:2012-12-13 13:25:19

标签: postgresql concatenation aggregate-functions group-concat

我正在尝试按aggregate function concatenates创建groupingTable Numbers 123 145 187 105 。我该怎么办呢?假设我有一张如下表格。

105_123_145_187

我希望结果看起来像

group_concat

如果我在MySQL工作,我知道如何使用_分隔符{{1}}。

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

3 个答案:

答案 0 :(得分: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
);

答案 1 :(得分:1)

对于现代PostgreSQL使用string_agg(columnname,'_')

对于旧版本8.4及更高版本,请使用string_to_array(array_agg(columname), '_')

请参阅the array functions and operators documentation

示例:

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版本。

答案 2 :(得分:-3)

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

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

我根本不熟悉pgSQL,但编写聚合函数的答案就在那里,请查看the pgSQL manual如何编写函数。