1

我最喜欢的 postgres 聚合之一是“列表”,根据我在网络上找到的少量证据,归因于“idocs 中的 Chris Rohlfs”。

CREATE FUNCTION comma_cat (text, text)
  RETURNS text AS
  'SELECT CASE
    WHEN $2 is null or $2 = '''' THEN $1
    WHEN $1 is null or $1 = '''' THEN $2
    ELSE $1 || '', '' || $2
  END'
LANGUAGE sql;

CREATE AGGREGATE list (BASETYPE = text, SFUNC = comma_cat, STYPE = text, INITCOND = '');

有时,我发现我希望它消除重复项。一个旧的邮件列表线程表明这种方法不能进行排序,这可能是重复删除的交易杀手。同一线程中的另一篇文章建议了一个做同样事情的函数;也许为此目的它更可修改?

与此同时,我只会用另一种语言来按摩输出。但是,如果我们可以直接在 postgres 中执行此操作,那就太酷了!

4

2 回答 2

3

您可以使用中间数组:

CREATE OR REPLACE FUNCTION comma_cat(text[], text)
  RETURNS text[] AS
$BODY$
  SELECT
    CASE WHEN $1 @> ARRAY[$2] THEN $1
    ELSE $1 || $2
  END
$BODY$
  LANGUAGE 'sql' VOLATILE;

CREATE OR REPLACE FUNCTION comma_finish(text[])
  RETURNS text AS
$BODY$
    SELECT array_to_string($1, ', ')
$BODY$
  LANGUAGE 'sql' VOLATILE
  COST 100;

CREATE AGGREGATE list (BASETYPE = text, SFUNC = comma_cat, STYPE = text[], FINALFUNC = comma_finish, INITCOND = '{NULL, NULL}');

value    id
-------- --
"puer"   1
"socer"  2
"vesper" 3
"vesper" 4
"gener"  5
"asper"  6
"asper"  7
"miser"  8
"tener"  9
"liber"  10
"puer"   11

SELECT list(value)
FROM t_text

"puer, vesper, gener, asper, miser, tener, liber, socer"
于 2009-02-18T21:59:32.800 回答
3

您可以在聚合函数调用中放置一个“不同的”限定符以删除重复项:

select list(distinct <column>)
from...
于 2010-11-01T20:21:08.457 回答