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 ;
Last modified: 11 agosto, 2015