PostgreSQL GROUP_CONCAT() Equivalent

Some RDBMSs like MySQL and MariaDB have a GROUP_CONCAT() function that allows you to return a query column as a delimited list (for example, a comma separated list).

PostgreSQL has a similar function called STRING_AGG(). This function works in pretty much the same way that GROUP_CONCAT() works in MySQL and MariaDB.

Example

Here’s a basic example to demonstrate how PostgreSQL’s STRING_AGG() function works:

SELECT STRING_AGG(genre, ',') FROM Genres;

Result:

Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk

Here’s what happens when we just do the query without the STRING_AGG() function:

SELECT genre FROM Genres;

Result:

+---------+
|  genre  |
+---------+
| Rock    |
| Jazz    |
| Country |
| Pop     |
| Blues   |
| Hip Hop |
| Rap     |
| Punk    |
+---------+
(8 rows)

We get eight rows, each with a separate value, instead of one long comma separated row of all values.

If anything, PostgreSQL’s STRING_AGG() is more like MySQL’s GROUP_CONCAT() than MariaDB’s function of the same name. I say this because MariaDB’s GROUP_CONCAT() allows us to provide a LIMIT clause (as from MariaDB 10.3.3), right from within the function itself. MySQL GROUP_CONCAT() doesn’t support the LIMIT clause, and neither does PostgreSQL’s STRING_AGG() function (at least, not at the time of this writing).

Another difference is that PostgreSQL’s STRING_AGG() requires a second argument (that specifies the delimiter to use). Both MySQL and MariaDB make this optional with their GROUP_CONCAT() functions.

Postgres’s STRING_AGG() accepts an ORDER BY clause, and a DISTINCT clause (as do MariaDB and MySQL’s GROUP_CONCAT() functions).

See STRING_AGG() Function in PostgreSQL for more examples.

And in case you’re interested, SQL Server also has a STRING_AGG() function that works in pretty much the same way.