Agregatno spajanje stringova za PostgreSQL

Sunday, 26.08.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