質問

私のお気に入りのPostgresの凝集体の一つは、私がウェブ上で見つけることができ乏しい証拠によると、「IDocの中でクリス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でこれを行うことができればしかし、それはクールになる!

役に立ちましたか?

解決

あなたは中間の配列を使用することができます:

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