Saltar al contenido

Postgresql GROUP_CONCAT equivalente?

Agradecemos tu ayuda para extender nuestros posts sobre las ciencias informáticas.

Solución:

Desde 9.0 esto es aún más fácil:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id

Este es probablemente un buen punto de partida (solo versión 8.4+):

SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field

array_agg devuelve un arraypero puede CAST eso para enviar un mensaje de texto y editar según sea necesario (consulte las aclaraciones a continuación).

Antes de la versión 8.4, debe definirlo usted mismo antes de usarlo:

CREATE AGGREGATE array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = ''
);

(parafraseado de la documentación de PostgreSQL)

Aclaraciones:

  • El resultado de lanzar un array al texto es que el resultado string comienza y termina con llaves. Esos frenos deben quitarse por algún método, si no se desean.
  • La conversión de ANYARRAY a TEXT simula mejor la salida CSV, ya que los elementos que contienen comas incrustadas se comillas dobles en la salida en estilo CSV estándar. Ni array_to_string() ni string_agg() (la función “group_concat” agregada en 9.1) citan cadenas con comas incrustadas, lo que da como resultado un número incorrecto de elementos en la lista resultante.
  • La nueva función 9.1 string_agg() NO convierte primero los resultados internos en TEXTO. Entonces, “string_agg (value_field)” generaría un error si value_field es un número entero. Se requeriría “string_agg(value_field::text)”. El método array_agg() requiere solo una conversión después de la agregación (en lugar de una conversión por valor).

SELECT array_to_string(array(SELECT a FROM b),', ');

Lo haré también.

Nos puedes añadir valor a nuestra información añadiendo tu veteranía en las referencias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *