Modifier postgresql « liste » globale pour supprimer les doublons
-
05-09-2019 - |
Question
L'un de mes préférés postgres des agrégats est selon les éléments de preuve rares « liste », attribué à « Chris Rohlfs dans les IDocs » Je peux trouver sur le web.
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 pour éliminer les doublons. vieux fil de la liste de diffusion suggère que cette approche ne peut pas ne le tri, ce qui pourrait être un accord-killer pour l'élimination de la duplication. un autre poste dans le même fil suggère une fonction qui fait la même chose; peut-être qu'il est plus modifiable à cet effet?
En attendant, je vais juste masser la sortie dans une autre langue. Mais ce serait cool si on pouvait le faire directement dans Postgres!
La solution
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"
Autres conseils
vous pouvez simplement mettre un qualificatif « distinct » dans l'appel de fonction d'agrégation pour supprimer les doublons:
select list(distinct <column>)
from...