Mysql
 sql >> Database >  >> RDS >> Mysql

Rinominare le colonne di una tabella colonne secondo una mappatura definita in un'altra tabella - con MYSQL

Penso di aver capito che vuoi selezionare una colonna per nome e i nomi sono stringhe nel tuo TABLE_MASTER.

Non è possibile eseguire questa operazione in una singola query SQL, poiché SQL non può selezionare una colonna utilizzando un'espressione stringa. C'è una differenza tra una stringa e un identificatore. Ad esempio, questo seleziona i dati da una colonna in base all'identificatore:

SELECT header01 ...

Ma la seguente è un'espressione stringa (semplice, che è solo un valore costante). Restituisce solo una stringa fissa 'header01', NON i dati da una colonna con quel nome:

SELECT 'header01' ...

Allo stesso modo, l'utilizzo di qualsiasi altra espressione in un elenco di selezione seleziona solo il valore di tale espressione, NON i dati archiviati in una colonna denominata dal valore stringa dell'espressione.

Pertanto, se vuoi che una query restituisca una colonna dinamica denominata da qualche altra variabile o espressione, non puoi farlo nella stessa query in cui hai letto quell'espressione. Devi formattare una nuova query SQL dai valori che hai letto. Questa è chiamata istruzione SQL dinamica (già menzionato da spencer7593, che ha pubblicato una risposta mentre stavo scrivendo la mia risposta).

Puoi usare il tuo TABLE_MASTER per formattare un'istruzione SQL dinamica per recuperare le colonne e ridefinire il loro alias:

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

Il risultato di ciò è una stringa che forma un'altra istruzione SELECT, questa rinomina le colonne come desideri:

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

Quindi puoi utilizzare la stringa memorizzata in @sql come una query SQL dinamica.

Ecco la procedura che fa questo:

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 ;

Chiama la procedura e ottieni il risultato:

CALL MyProc();

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

Devo commentare che questo è un sacco di problemi da affrontare. Preferirei recuperare i dati così come sono nel database e riformattarli nel codice dell'applicazione. Quindi non dovrei utilizzare alcun SQL dinamico per formattare le colonne.