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

Autor: Janmi

Janmi es un informático entusiasta de la ciencia ficción, el diseño gráfico, el universo de Tolkien, fantasía épica y otras cosas frikis. Apasionado por la tecnología, ya sea desde el punto de visto técnico, domótico, funcional o de diseño.