我最喜欢的Postgres的聚集是“清单”,归结为“克里斯Rohlfs中的IDoc”根据由于缺乏证据,我可以在网上找到。

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的!

有帮助吗?

解决方案

可以使用中间阵列:

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"

其他提示

你可以把一个“不同的”限定的聚集函数调用内部删除重复:

select list(distinct <column>)
from...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top