2009-02-18 10 views
1

L'un de mes agrégats postgres préférés est "liste", attribué à "Chris Rohlfs dans les idocs" selon les rares preuves que je peux trouver sur le web.Modifier l'agrégat "liste" postgresql pour supprimer les doublons

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 = ''); 

Je trouve, parfois, que je voudrais éliminer les doublons. Un old mailing list thread suggère que cette approche ne peut pas faire le tri, ce qui pourrait être un deal-tueur pour la suppression de la duplication. Another post in the same thread suggère une fonction qui fait la même chose; peut-être que c'est plus modifiable à cet effet?

En attendant, je vais juste masser la sortie dans une autre langue. Mais ce serait cool si nous pouvions le faire directement dans postgres!

+0

Voir post – Quassnoi

+0

mise à jour Déplacé de modifier: Malheureusement, , L'approche originale de Quassnoi n'a pas semblé aider; J'ai obtenu la même liste de résultats de la nouvelle méthode que je reçois de ce que j'utilisais à l'origine. J'ai essayé d'ajouter QUAND 1 $ = 2 $ et 1 $ initialement, mais je ne savais pas à propos de SORTOP. –

Répondre

3

Vous pouvez utiliser des tableaux intermédiaires:

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" 
+0

Ah ha; maintenant celui-ci fonctionne, même si j'ai dû supprimer le COST 100 car il m'a donné une erreur de syntaxe (postgresql 8.2.3). Merci beaucoup. Maintenant, je dois aller trouver une bonne référence sur la création de fonctions et d'agrégats afin que je puisse comprendre ce qu'il fait! –

+0

Eh bien, le premier google hit sur "posgresql create aggregate" donne ceci: http://www.postgresql.org/docs/8.1/interactive/sql-createaggregate.html :) – Quassnoi

+0

Oh, définitivement; ce sera mon premier arrêt. Merci encore! –

3

vous pouvez simplement mettre un qualificatif « distinct » dans l'appel de fonction d'agrégation pour supprimer les doublons:

select list(distinct <column>) 
from... 
+0

Cela fonctionne très bien pour moi .... merci ... –

Questions connexes