سؤال

أحد مجاميع الخوارز المفضلة لدي هو "قائمة"، والتي تعزى إلى "كريس روهلافات في 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...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top