czasem jest taka potrzeba by zwrócić kilka połączonych stringów z kolejnych rekordów.
np.:
mając tabelkę z takimi danymi:
> select pracownik from pracownicy where firma_id = 1;
- Jan Kowalski
- Hubert Lubaczewski
- Piotr Nowak
- Adam Słodowy
chcielibyśmy dostać jedno pole z zawartością:
Jan Kowalski, Hubert Lubaczewski, Piotr Nowak, Adam Słodowy
lub wręcz posortowane:
Adam Słodowy, Hubert Lubaczewski, Jan Kowalski, Piotr Nowak
aby to zrobić najwygodniej jest zdefiniować własny agregat (czyli funkcję taką jak min(), max(), sum(), avg()).
najpierw zdefiniujemy funkcję łączącą:
CREATE OR replace function agg_text_sum(txt_before TEXT, txt_new TEXT) RETURNS TEXT AS
$BODY$
DECLARE
BEGIN
IF (txt_before IS NULL) THEN
RETURN txt_new;
END IF;
RETURN txt_before || ‘, ‘ || txt_new;
END;
$BODY$
LANGUAGE ‘plpgsql';
następnie tworzymy agregat:
CREATE aggregate text_sum (
basetype = TEXT,
sfunc = agg_text_sum,
stype = TEXT
);
i już możemy:
> select text_sum(pracownik) from pracownicy where firma_id = 1;
- Jan Kowalski, Hubert Lubaczewski, Piotr Nowak, Adam Słodowy
aby to posortować trzeba uciec się do podzapytań:
> select text_sum(pracownik) from (select pracownik from pracownicy where firma_id = 1 order by pracownik) x;
- Adam Słodowy, Hubert Lubaczewski, Jan Kowalski, Piotr Nowak