Estoy buscando una forma de concatenar las cadenas de un campo dentro de un grupo por consulta. Entonces, por ejemplo, tengo una tabla:
ID COMPANY_ID EMPLOYEE
1 1 Anna
2 1 Bill
3 2 Carol
4 2 Dave
y quería agrupar por company_id para obtener algo como:
COMPANY_ID EMPLOYEE
1 Anna, Bill
2 Carol, Dave
Hay una función incorporada en mySQL para hacer esto group_concat
Respuestas:
PostgreSQL 9.0 o posterior:
Las versiones recientes de Postgres (desde finales de 2010) tienen la
string_agg(expression, delimiter)
función que hará exactamente lo que pedía la pregunta, incluso permitiéndole especificar la cadena delimitador:Postgres 9.0 también agregó la capacidad de especificar una
ORDER BY
cláusula en cualquier expresión agregada ; de lo contrario, el orden no está definido. Entonces ahora puedes escribir:O de hecho:
PostgreSQL 8.4 o posterior:
PostgreSQL 8.4 (en 2009) introdujo la función agregada
array_agg(expression)
que concatena los valores en una matriz. Luegoarray_to_string()
se puede usar para dar el resultado deseado:string_agg
para versiones anteriores a la 8.4:En caso de que alguien se encuentre con esto buscando una compatibilidad de compatibilidad para bases de datos anteriores a 9.0, es posible implementar todo
string_agg
excepto laORDER BY
cláusula.Entonces, con la definición a continuación, esto debería funcionar igual que en una base de datos Postgres 9.x:
Pero esto será un error de sintaxis:
Probado en PostgreSQL 8.3.
Variaciones personalizadas (todas las versiones de Postgres)
Antes de 9.0, no había una función agregada incorporada para concatenar cadenas. La implementación personalizada más simple ( sugerida por Vajda Gabo en esta publicación de la lista de correo , entre muchas otras) es usar la
textcat
función incorporada (que se encuentra detrás del||
operador):Aquí está la
CREATE AGGREGATE
documentación.Esto simplemente pega todas las cadenas juntas, sin separador. Para obtener un "," insertado entre ellos sin tenerlo al final, es posible que desee hacer su propia función de concatenación y sustituirla por el "textcat" anterior. Aquí hay uno que armé y probé en 8.3.12:
Esta versión generará una coma incluso si el valor en la fila es nulo o vacío, por lo que obtendrá una salida como esta:
Si prefiere eliminar comas adicionales para generar esto:
Luego agregue un
ELSIF
cheque a la función de esta manera:fuente
array_to_string(array_agg(employee), ',')
?Order By
cláusula dentro de la función agregada, por ejemplostring_agg(employee, ',' Order By employee)
¿Qué tal el uso de las funciones de matriz integradas de Postgres? Al menos en 8.4 esto funciona de la caja:
fuente
A partir de PostgreSQL 9.0 puede usar la función agregada llamada string_agg . Su nuevo SQL debería verse así:
fuente
No reclamo crédito por la respuesta porque la encontré después de buscar:
Lo que no sabía es que PostgreSQL le permite definir sus propias funciones agregadas con CREATE AGGREGATE
Esta publicación en la lista PostgreSQL muestra cuán trivial es crear una función para hacer lo que se requiere:
fuente
Como ya se mencionó, crear su propia función agregada es lo correcto. Aquí está mi función agregada de concatenación (puede encontrar detalles en francés ):
);
Y luego úsalo como:
fuente
Este último fragmento de la lista de anuncios podría ser de interés si va a actualizar a 8.4:
Me vincularía a los documentos de desarrollo 8.4 pero todavía no parecen enumerar esta característica.
fuente
Continuando con la respuesta de Kev, usando los documentos de Postgres:
Primero, cree una matriz de los elementos, luego use la
array_to_string
función incorporada.fuente
Siguiendo una vez más en el uso de una función agregada costumbre de la concatenación de cadenas: Es necesario recordar que la instrucción de selección colocará filas en cualquier orden, por lo que tendrá que hacer un sub seleccionar en el de la sentencia con una orden por cláusula, y luego una selección externa con una cláusula group by para agregar las cadenas, por lo tanto:
fuente
Esta documentación de PostgreSQL me pareció útil: http://www.postgresql.org/docs/8.0/interactive/functions-conditional.html .
En mi caso, busqué SQL simple para concatenar un campo con paréntesis, si el campo no está vacío.
fuente
Utilice la
STRING_AGG
función para PostgreSQL y Google BigQuery SQL :fuente
De acuerdo con la versión PostgreSQL 9.0 y superior, puede usar la función agregada llamada string_agg. Su nuevo SQL debería verse así:
fuente
También puede usar la función de formato. Que también puede encargarse implícitamente de la conversión de tipo de texto, int, etc.
fuente
Estoy usando Jetbrains Rider y fue una molestia copiar los resultados de los ejemplos anteriores para volver a ejecutarlos porque parecía envolverlo todo en JSON. Esto los une en una sola declaración que fue más fácil de ejecutar
fuente
Si está en Amazon Redshift, donde string_agg no es compatible, intente usar listagg.
fuente