Agregatno spajanje stringova za PostgreSQL

August 26, 2007 – Srdjan

SQL 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

Post a Comment