SQL – Cómo concatenar varios registros en una columna
¿Necesitas concatenar los valores de varios registros en una única columna de Base de Datos? A continuación te mostraremos una función SQL para Oracle que concatena varios registros en una sola columna, separándolos por comas.
Función SQL para Oracle para concatenar registros en una columna:
CREATE OR REPLACE FUNCTION tuesquema."ROWCONCAT" (q IN VARCHAR2) RETURN VARCHAR2 IS ret VARCHAR2(4000); hold VARCHAR2(4000); cur sys_refcursor; BEGIN OPEN cur FOR q; LOOP FETCH cur INTO hold; EXIT WHEN cur%NOTFOUND; IF ret IS NULL THEN ret := hold; ELSE ret := ret || ',' || hold; END IF; END LOOP; RETURN ret; END; / |
Ejemplo de Uso:
Dada la BBDD:
Tabla: Usuarios
id_usuario – N(9) – PK
nombreusuario – V2(250)
Ejemplos de valores:
1, Juan
2, Silvia
Tabla: Perfiles
id_perfil – N(9) – PK
nombreperfil – V2(250)
Ejemplos de Valores:
123, Administrador
124, Genérico
125, Programador
126, Invitado
Tabla: PerfilesUsuarios
id_usuario – N(9) – PK
id_perfil – N(9) – PK
Ejemplos de valores:
1, 123
1, 124
1,126
2, 125
2, 126
Existiendo una relación N-M entre Usuarios y Perfiles con la tabla intermedia PerfilesUsuarios….
Si queremos obtener todos los datos de usuarios, cada campo en una columna, y luego otra columna con el cruce de las tablas entre usuarios y perfiles, podríamos hacer lo siguiente:
SELECT usu.*, rowconcat('select per.nombreperfil from perfiles per, perfilesusuarios peu where peu.id_perfil=per.id_perfil and peu.id_usuario=' || usu.id_usuario) AS "Perfiles del Usuario separados por comas" FROM usuarios usu |
NOTA: recuerda que para ejecutar esta consulta, la función «rowconcat» ha tenido que ser creada antes…
Resultados:
1, Juan, Administrador, Genérico, Invitado
2, Silvia, Programador, Invitado