sql >> Base de Datos >  >> RDS >> Mysql

Cambiar el nombre de las columnas de las columnas de una tabla de acuerdo con una asignación definida en otra tabla, con MYSQL

Creo que entiendo que desea seleccionar una columna por nombre, y los nombres son cadenas en su TABLE_MASTER.

No puede hacer esto en una sola consulta SQL, porque SQL no puede seleccionar una columna mediante una expresión de cadena. Hay una diferencia entre una cadena y un identificador. Por ejemplo, esto selecciona datos de una columna por identificador:

SELECT header01 ...

Pero la siguiente es una expresión de cadena (una simple, que es solo un valor constante). Solo devuelve una cadena fija 'header01', NO los datos de una columna con ese nombre:

SELECT 'header01' ...

Del mismo modo, el uso de cualquier otra expresión en una lista de selección solo selecciona el valor de esa expresión, NO los datos almacenados en una columna nombrada por el valor de cadena de la expresión.

Por lo tanto, si desea que una consulta devuelva una columna dinámica nombrada por alguna otra variable o expresión, no puede hacerlo en la misma consulta donde lee esa expresión. Debe formatear una nueva consulta SQL a partir de los valores que lee. Esto se denomina sentencia SQL dinámica. (ya mencionado por spencer7593, quien publicó una respuesta mientras yo escribía mi propia respuesta).

Podría usar su TABLE_MASTER para formatear una instrucción SQL dinámica para obtener columnas y redefinir su alias:

SELECT CONCAT(
  'SELECT ', 
   GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ', 
   QUOTE(MAX(NAME)), ' AS NAME ',
  'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;

El resultado de esto es una cadena que forma otra instrucción SELECT, esta cambia el nombre de las columnas como desee:

SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE  

Luego puede usar la cadena almacenada en @sql como una consulta SQL dinámica.

Este es el procedimiento que hace esto:

DELIMITER ;;

CREATE PROCEDURE MyProc()
BEGIN
    SELECT CONCAT(
      'SELECT ', 
       GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ', 
       QUOTE(MAX(NAME)), ' AS NAME ',
      'FROM TABLE_EXAMPLE'
    ) INTO @sql
    FROM TABLE_MASTER;
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

DELIMITER ;

Llame al procedimiento y obtenga el resultado:

CALL MyProc();

+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01          | data02          | Paul |
| data11          | data12          | Paul |
+-----------------+-----------------+------+

Tengo que comentar que esto es un montón de problemas para pasar. Preferiría obtener los datos tal como están en la base de datos y reformatearlos en el código de mi aplicación. Entonces no tendría que usar ningún SQL dinámico para formatear las columnas.