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
  1. One Response to “Agregatno spajanje stringova za PostgreSQL”

  2. 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

Post a Comment