Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Renomeando as colunas de uma tabela de colunas de acordo com um mapeamento definido em outra tabela - com MYSQL


Acho que entendi que você deseja selecionar uma coluna por nome e os nomes são strings em seu TABLE_MASTER.

Você não pode fazer isso em uma única consulta SQL, porque o SQL não pode selecionar uma coluna usando uma expressão de string. Há uma diferença entre uma string e um identificador. Por exemplo, isso seleciona dados de uma coluna por identificador:
SELECT header01 ...

Mas o seguinte é uma expressão de string (uma simples, que é apenas um valor constante). Ele retorna apenas uma string fixa 'header01', NÃO os dados de uma coluna com esse nome:
SELECT 'header01' ...

Da mesma forma, usar qualquer outra expressão em uma lista de seleção seleciona apenas o valor dessa expressão, NÃO os dados armazenados em uma coluna nomeada pelo valor da string da expressão.

Portanto, se você quiser que uma consulta retorne uma coluna dinâmica nomeada por alguma outra variável ou expressão, não poderá fazê-lo na mesma consulta em que leu essa expressão. Você precisa formatar uma nova consulta SQL a partir dos valores lidos. Isso é chamado de instrução SQL dinâmica (já mencionado por spencer7593, que postou uma resposta enquanto eu escrevia minha própria resposta).

Você pode usar seu TABLE_MASTER para formatar uma instrução SQL dinâmica para buscar colunas e redefinir seu alias:
SELECT CONCAT(
  'SELECT ', 
   GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ', 
   QUOTE(MAX(NAME)), ' AS NAME ',
  'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;

O resultado disso é uma string que forma outra instrução SELECT, esta renomeia as colunas como você deseja:
SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE  

Então você pode usar a string armazenada em @sql como uma consulta SQL dinâmica.

Aqui está o procedimento que faz isso:
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 ;

Chame o procedimento e obtenha o resultado:
CALL MyProc();

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

Eu tenho que comentar que isso é um monte de problemas para passar. Prefiro buscar os dados como estão no banco de dados e reformatá-los no código do meu aplicativo. Assim, não precisaria usar nenhum SQL dinâmico para formatar as colunas.