Alcuni RDBMS come MySQL e MariaDB hanno un GROUP_CONCAT()
funzione che consente di restituire una colonna di query come un elenco delimitato (ad esempio un elenco separato da virgole).
PostgreSQL ha una funzione simile chiamata STRING_AGG()
. Questa funzione funziona più o meno allo stesso modo di GROUP_CONCAT()
funziona in MySQL e MariaDB.
Esempio
Ecco un esempio di base per dimostrare come STRING_AGG()
di PostgreSQL la funzione funziona:
SELECT STRING_AGG(genre, ',') FROM Genres;
Risultato:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Ecco cosa succede quando eseguiamo la query senza STRING_AGG()
funzione:
SELECT genre FROM Genres;
Risultato:
+---------+ | genre | +---------+ | Rock | | Jazz | | Country | | Pop | | Blues | | Hip Hop | | Rap | | Punk | +---------+ (8 rows)
Otteniamo otto righe, ciascuna con un valore separato, invece di una lunga riga separata da virgole di tutti i valori.
Semmai, STRING_AGG()
di PostgreSQL è più simile a GROUP_CONCAT()
di MySQL rispetto all'omonima funzione di MariaDB. Lo dico perché GROUP_CONCAT()
di MariaDB ci consente di fornire un LIMIT
clausola (come da MariaDB 10.3.3), direttamente all'interno della funzione stessa. MySQL GROUP_CONCAT()
non supporta il LIMIT
clausola, e nemmeno STRING_AGG()
di PostgreSQL funzione (almeno, non al momento in cui scrivo).
Un'altra differenza è che STRING_AGG()
di PostgreSQL richiede un secondo argomento (che specifica il delimitatore da utilizzare). Sia MySQL che MariaDB lo rendono opzionale con il loro GROUP_CONCAT()
funzioni.
STRING_AGG()
di Postgres accetta un ORDER BY
clausola e un DISTINCT
clausola (così come MariaDB e GROUP_CONCAT()
di MySQL funzioni).
Vedi STRING_AGG()
Funzione in PostgreSQL per ulteriori esempi.
E se sei interessato, SQL Server ha anche un STRING_AGG()
funzione che funziona più o meno allo stesso modo.