In Tutoriales y tips Written by

Cómo concatenar cadenas de un campo string en PostgreSQL en una consulta agrupada con group by

Ejemplo de como concatenar campos en una consulta agrupada (group by) en postgres usando sql. Es un comportamiento similar al de mysql con su función GROUP_CONCAT

Supongamos que en una base de datos de PostgreSQL un campo multivalor, como por ejemplo una tabla de contactos y otra tabla de teléfonos con una relación uno a muchos. Ahora necesito en una sola tabla tener la lista de contactos y por cada registro los números telefónicos en un solo campo de texto separados por comas.Al ejecutar una consulta JOIN entre la tabla principal y la tabla multivalor obtenemos:

cod  nombre  telefono
 1     ANA    123
 1     ANA    124
 2     PEDRO  987
 2     PEDRO  986

Pero queremos un resultado así:

cod   nombre  telefono
 1     ANA    123, 124
 2     PEDRO  987, 986

En mysql hay una función para hacer esto GROUP_CONCAT

La solución para Postgres 9.0 o superior:

Las nuevas versiones de PostgreSQL tienen el string_agg (expresión, delimitador) función que va a hacer exactamente lo que la pregunta pide, incluso lo que le permite especificar el delimitador de serie: PostgreSQL 9 de Uso General Funciones de agregado

Actualización a partir de PostgreSQL 8.4:

PostgreSQL 8.4 introduce la función de agregado ARRAY_AGG (expresión) que concatena los valores en una matriz. Entonces array_to_string () se puede usar para dar el resultado deseado:
SELECT cod, nombre, array_to_string ( ARRAY_AGG ( telefono),  ", " ) 
DE mitablaoconsulta
 GROUP BY cod, nombre;

Solución original (para pre-8.4 PostgreSQL)

No hay una función integrada de conjunto para concatenar cadenas. Parece que esto sería necesario, pero no es parte del grupo inicial. Una búsqueda en la Web revela sin embargo algunas implementaciones manuales el mismo ejemplo :
CREATE GLOBAL textcat_all ( 
  BaseType     = texto , 
  sfunc        = textcat , 
  stype        = texto , 
  initcond     =  '' 
);

Aquí está la documentación CREATE AGGREGATE.
Con el fin de obtener el "," insertado entre ellos sin tener que, al final, es posible que desee hacer su función propia concatenación y sustituirla por la "textcat" anterior. Aquí está uno que arme, pero no han probado ( actualizar: probado en 8.3.12 y funciona bien ):
CREAR  FUNCION commacat ( texto según , texto instr ) devuelve texto COMO  $ $ 
  EMPEZAR 
    SI acc IS  NULL  OR acc =  ''  LUEGO 
      REGRESAR instr ; 
    ELSE 
      RETURN acc | |  ','  | | instr ; 
    END  IF ; 
  END ; 
$ $ LANGUAGE plpgsql ;
Nota: La función de arriba mostrará una coma, incluso si el valor de la fila es nulo / vacío, que da salida:
un , b , c ,  , e ,  , g
Si prefiere eliminar las comas adicionales a la producción:
un , b , c , e , g
sólo tiene que añadir un ELSIF cheque a la función:
CREATE  FUNCTION commacat_ignore_nulls ( texto según , texto instr ) devuelve texto COMO  $ $ 
  EMPEZAR 
    SI acc IS  NULL  OR acc =  ''  LUEGO 
      REGRESAR instr ; 
    ELSIF instr IS  NULL  OR instr =  ''  LUEGO 
      REGRESAR acc ; 
    ELSE 
      RETURN acc | |  ','  | | instr ; 
    END  IF ; 
  END ; 
$ $ LANGUAGE plpgsql ;
Comentarios
(Visited 2.419 times, 1 visits today)

Last modified: 11 agosto, 2015

Close