Agregatno spajanje stringova za PostgreSQL
August 26, 2007 – SrdjanSQL standard propisuje 5 agregatnih funkcija: AVG, COUNT, MAX, MIN i SUM. Uz izuzetak COUNT funkcije, ostale agregatne funkcije rade nad numeričkim vrednostima.
Šta da radimo ako nam je potrebno prosto spajanje (konkatenacija) stringova? Iskoristićemo PostgreSQL-ovu mogućnost CREATE AGGREGATE za kreiranje nove agregatne funkcije.
Uopšte nije teško na internetu naći ovakvu funkciju. Prikazaću jednu koja je napisana upotrebom SQL jezika:
CREATE FUNCTION agg_concat (text, text)
RETURNS text AS
$body$
SELECT
CASE WHEN $1 IS NULL
THEN $2
ELSE $1 || ', ' || $2
END
$body$
LANGUAGE 'sql';
CREATE AGGREGATE agg_concat (
BASETYPE = TEXT,
SFUNC = agg_concat,
STYPE = TEXT
);
Kako se koristi ova nova agregatna funkcija?
Recimo da imamo jednu tabelu i njene podatke:
CREATE TABLE informacije (
datum_informacije DATE NOT NULL,
informacija VARCHAR(10) NOT NULL,
CONSTRAINT pk_inf
PRIMARY KEY (datum_informacije, informacija)
);
INSERT INTO informacije
(datum_informacije, informacija)
VALUES ('2007-08-23', 'posao');
INSERT INTO informacije
(datum_informacije, informacija)
VALUES ('2007-08-23', 'odmor');
INSERT INTO informacije
(datum_informacije, informacija)
VALUES ('2007-08-24', 'posao');
INSERT INTO informacije
(datum_informacije, informacija)
VALUES ('2007-08-24', 'kafic');
INSERT INTO informacije
(datum_informacije, informacija)
VALUES ('2007-08-24', 'bioskop');
COMMIT;
Ako hoćemo da izvršimo grupisanje informacija po danu, izvršimo sledeći upit:
SELECT datum_informacije,
agg_concat(informacija) AS informacije
FROM informacije
GROUP BY datum_informacije
ORDER BY datum_informacije;
Dobijamo sledeći rezultat:
datum_informacije informacije ================= =========== 2007-08-23 posao, odmor 2007-08-24 posao, kafic, bioskop