Agregatno spajanje stringova za PostgreSQL
Sunday, 26.08.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
One Response to “Agregatno spajanje stringova za PostgreSQL”
Hvala, matori, ne mogu da vjerujem da mi je upravo ovo trebalo i, poslije bukvalno 10 sekundi potrage na Guglu, nađem baš to 🙂 Nisam znao za to “create aggregate”, ali eto sad znam 🙂 I to nađoh na srpskom jeziku, za ne povjerovati. Hvala još jednom!
By Darko Maksimović on Mar 13, 2009