Algunos RDBMS como MySQL y MariaDB tienen un GROUP_CONCAT()
función que le permite devolver una columna de consulta como una lista delimitada (por ejemplo, una lista separada por comas).
PostgreSQL tiene una función similar llamada STRING_AGG()
. Esta función funciona más o menos de la misma manera que GROUP_CONCAT()
funciona en MySQL y MariaDB.
Ejemplo
Aquí hay un ejemplo básico para demostrar cómo STRING_AGG()
de PostgreSQL la función funciona:
SELECT STRING_AGG(genre, ',') FROM Genres;
Resultado:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Esto es lo que sucede cuando hacemos la consulta sin STRING_AGG()
función:
SELECT genre FROM Genres;
Resultado:
+---------+ | genre | +---------+ | Rock | | Jazz | | Country | | Pop | | Blues | | Hip Hop | | Rap | | Punk | +---------+ (8 rows)
Obtenemos ocho filas, cada una con un valor independiente, en lugar de una larga fila separada por comas de todos los valores.
En todo caso, el STRING_AGG()
de PostgreSQL es más como GROUP_CONCAT()
de MySQL que la función de MariaDB del mismo nombre. Digo esto porque GROUP_CONCAT()
de MariaDB nos permite proporcionar un LIMIT
cláusula (a partir de MariaDB 10.3.3), directamente desde dentro de la propia función. MySQL GROUP_CONCAT()
no admite el LIMIT
y tampoco la cláusula STRING_AGG()
de PostgreSQL función (al menos, no en el momento de escribir este artículo).
Otra diferencia es que STRING_AGG()
de PostgreSQL requiere un segundo argumento (que especifica el delimitador a usar). Tanto MySQL como MariaDB hacen que esto sea opcional con su GROUP_CONCAT()
funciones.
STRING_AGG()
de Postgres acepta un ORDER BY
cláusula, y un DISTINCT
cláusula (al igual que MariaDB y MySQL's GROUP_CONCAT()
funciones).
Ver STRING_AGG()
Función en PostgreSQL para más ejemplos.
Y en caso de que esté interesado, SQL Server también tiene un STRING_AGG()
función que funciona prácticamente de la misma manera.