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ă eroarefunction string_agg(integer, unknown) does not exist. Scriestring_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.