تعديل postgresql "قائمة" إجمالية لإزالة التكرارات
-
05-09-2019 - |
سؤال
أحد مجاميع الخوارز المفضلة لدي هو "قائمة"، والتي تعزى إلى "كريس روهلافات في IDOCs" وفقا للأدلة الفضجة التي يمكنني العثور عليها على الويب.
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 = '');
أجد، أحيانا، أنني أود أن القضاء على التكرارات. أ قائمة الرسائل البريدية القديمة يشير إلى أن هذا النهج لا يستطيع القيام بالفرز، مما قد يكون قاتل الصفقة لإزالة الازدواجية. وظيفة أخرى في نفس الخيط يقترح وظيفة التي تفعل الشيء نفسه؛ ربما يكون أكثر قابلية للتعديل لهذا الغرض؟
في غضون ذلك، سوف تدلي فقط الإخراج بلغة أخرى. ولكن سيكون من الرائع إذا استطعنا القيام بذلك مباشرة في الحائط!
المحلول
يمكنك استخدام الصفائف الوسيطة:
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...
لا تنتمي إلى StackOverflow