agregaty wielowartościowe

w 8.2 pojawiły się agregaty wielokolumnowe. muszę przyznać, że nie bawiły mnie za bardzo dopóki nie trafiłem na swój dawny post na google groupsach.

tyczy się on tego jak zapisać agregat łączący wiele tekstów w jeden – rozdzielony znakiem definiowanym w zapytaniu.

nie był to kod ładny.

saint zaproponował inne rozwiązanie, ale miało one w/g mnie dwie wady:

  1. konieczność obcinania końcowego separatora.
  2. zwraca pusty string a nie null w przypadku odpalenia na pustym zbiorze – a ja wolę null'a 🙂

oczywiście obie te rzeczy można prosto poprawić lekko modyfikując zapytanie, ale wolałbym by logika była w funkcjach.

no i wreszcie. dzięki 8.2 można zrobić coś takiego:

CREATE OR REPLACE FUNCTION agg_text_sum(in_base TEXT, new_text TEXT, separator TEXT) RETURNS TEXT AS $BODY$
DECLARE
BEGIN
IF in_base IS NULL THEN
RETURN new_text;
END IF;
RETURN in_base || separator || new_text;
END;
$BODY$ LANGUAGE 'plpgsql';
CREATE aggregate SUM(TEXT, TEXT) (
sfunc = agg_text_sum,
stype = TEXT
);

a potem można to stestować:

CREATE TABLE table_names AS SELECT oid::INT4 AS id, relname::TEXT AS TABLE_NAME FROM pg_class  WHERE relkind = 'r';
SELECT SUM(TABLE_NAME, ', ') FROM table_names;

i już. separator można dowolnie zmieniać

nie jest to może szczytowe osiągnięcie w inżynierii oprogramowania, ale może się przydać.