Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Umbenennen der Spalten einer Tabelle nach einer in einer anderen Tabelle definierten Zuordnung - mit MYSQL

Ich glaube, ich verstehe, dass Sie eine Spalte nach Namen auswählen möchten, und die Namen sind Zeichenfolgen in Ihrem TABLE_MASTER.

Dies ist in einer einzelnen SQL-Abfrage nicht möglich, da SQL keine Spalte mithilfe eines Zeichenfolgenausdrucks auswählen kann. Es gibt einen Unterschied zwischen einer Zeichenfolge und einem Bezeichner. Dies wählt beispielsweise Daten aus einer Spalte nach Bezeichner aus:

SELECT header01 ...

Aber das Folgende ist ein String-Ausdruck (ein einfacher Ausdruck, der nur ein konstanter Wert ist). Es gibt nur eine feste Zeichenfolge 'header01' zurück, NICHT die Daten aus einer Spalte mit diesem Namen:

SELECT 'header01' ...

Ebenso wählt die Verwendung eines anderen Ausdrucks in einer Auswahlliste nur den Wert dieses Ausdrucks aus, NICHT die Daten, die in einer Spalte gespeichert sind, die durch den Zeichenfolgenwert des Ausdrucks benannt ist.

Wenn Sie also möchten, dass eine Abfrage eine dynamische Spalte zurückgibt, die von einer anderen Variablen oder einem anderen Ausdruck benannt wird, können Sie dies nicht in derselben Abfrage tun, in der Sie diesen Ausdruck lesen. Sie müssen aus den gelesenen Werten eine neue SQL-Abfrage formatieren. Dies wird als dynamische SQL-Anweisung bezeichnet (bereits von spencer7593 erwähnt, der eine Antwort gepostet hat, während ich meine eigene Antwort geschrieben habe).

Sie könnten Ihren TABLE_MASTER verwenden, um eine dynamische SQL-Anweisung zu formatieren, um Spalten abzurufen und ihren Alias ​​neu zu definieren:

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

Das Ergebnis davon ist ein String, der eine weitere SELECT-Anweisung bildet, diese benennt die Spalten nach Belieben um:

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

Dann können Sie den in @sql gespeicherten String verwenden als dynamische SQL-Abfrage.

Hier ist das Verfahren, das dies tut:

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 ;

Rufen Sie die Prozedur auf und erhalten Sie das Ergebnis:

CALL MyProc();

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

Ich muss sagen, dass das eine Menge Ärger ist. Ich würde die Daten lieber so abrufen, wie sie in der Datenbank sind, und sie in meinem Anwendungscode neu formatieren. Dann müsste ich kein dynamisches SQL verwenden, um die Spalten zu formatieren.