string_agg în PostgreSQL

Funcții pentru text PostgreSQL 9.0+

Funcție de agregare care unește valorile text ale unui grup într-un singur text, cu separatorul ales și în ordinea dorită.

Sintaxă SQL
string_agg(expresie, separator [ORDER BY ...])

Ce face string_agg

string_agg face pentru rânduri ce face concat_ws pentru coloane: ia valorile din toate rândurile unui grup și le lipește cu un separator. Se folosește cu GROUP BY sau peste tot tabelul.

Ordinea valorilor nu este garantată decât dacă scrii ORDER BY în interiorul parantezelor. Valorile NULL sunt ignorate; dacă toate sunt NULL (sau grupul este gol), rezultatul este NULL.

Pentru a obține un tablou în loc de text, folosește array_agg.

Parametri

Parametru Descriere
expresie Valoarea de unit (text sau bytea). Numerele trebuie convertite: id::text.
separator Textul pus între valori.
ORDER BY Ordinea valorilor în rezultat.
DISTINCT string_agg(DISTINCT oras, ', ') elimină valorile repetate.

Ce returnează

Un text (sau NULL dacă nu există valori).

Exemple

Exemplul 1: Clienții din fiecare oraș

SELECT oras, string_agg(nume, ', ' ORDER BY nume) AS clienti
FROM clienti
GROUP BY oras
ORDER BY oras;

Rezultat în psql

  oras  |     clienti      
--------+------------------
 Brașov | Radu
 Cluj   | Elena, Mihai
 Iași   | Ana, Ioana, Vlad
(3 rows)

Exemplul 2: Produsele unei comenzi pe un singur rând

SELECT comanda_id,
       string_agg(cantitate || ' x ' || produs, '; ' ORDER BY produs) AS continut
FROM linii_comanda
GROUP BY comanda_id;

Rezultat în psql

 comanda_id |       continut       
------------+----------------------
       1042 | 1 x Lapte; 2 x Pâine
       1043 | 3 x Apă plată
(2 rows)

Exemplul 3: Valori unice

SELECT string_agg(DISTINCT oras, ', ' ORDER BY oras) AS orase_livrare FROM comenzi;

Rezultat în psql

   orase_livrare    
--------------------
 Brașov, Cluj, Iași
(1 row)

Greșeli frecvente

  • Dai un număr direct: string_agg(id, ',') dă eroare function string_agg(integer, unknown) does not exist. Scrie string_agg(id::text, ',').
  • Pui ORDER BY în afara funcției și te aștepți să ordoneze valorile din text. Ordinea din interiorul textului se scrie în paranteze.

Comenzi înrudite

  • concat, concat_ws și ||: Lipesc mai multe texte într-unul. || dă NULL dacă o parte este NULL, concat și concat_ws ignoră valorile NULL.