sql >> Databasteknik >  >> RDS >> Mysql

Byta namn på kolumnerna i en tabellkolumn enligt en mappning definierad i en annan tabell - med MYSQL

Jag tror att jag förstår att du vill välja en kolumn efter namn, och namnen är strängar i din TABLE_MASTER.

Du kan inte göra detta i en enda SQL-fråga, eftersom SQL inte kan välja en kolumn med hjälp av ett stränguttryck. Det är skillnad mellan en sträng och en identifierare. Detta väljer till exempel data från en kolumn efter identifierare:

SELECT header01 ...

Men följande är ett stränguttryck (ett enkelt sådant, som bara är ett konstant värde). Den returnerar bara en fast sträng 'header01', INTE data från en kolumn med det namnet:

SELECT 'header01' ...

På samma sätt, om du använder något annat uttryck i en urvalslista, väljs bara värdet för det uttrycket, INTE data som lagras i en kolumn som namnges av uttryckets strängvärde.

Om du därför vill att en fråga ska returnera en dynamisk kolumn som är namngiven av någon annan variabel eller uttryck, kan du därför inte göra det i samma fråga där du läste det uttrycket. Du måste formatera en ny SQL-fråga från de värden du läser. Detta kallas en dynamisk SQL-sats (Redan nämnt av spencer7593, som postade ett svar medan jag skrev mitt eget svar).

Du kan använda din TABLE_MASTER för att formatera en dynamisk SQL-sats för att hämta kolumner och omdefiniera deras alias:

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

Resultatet av detta är en sträng som bildar en annan SELECT-sats, denna byter namn på kolumnerna som du vill:

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

Sedan kan du använda strängen lagrad i @sql som en dynamisk SQL-fråga.

Här är proceduren som gör detta:

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 ;

Ring proceduren och få resultatet:

CALL MyProc();

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

Jag måste kommentera att det här är mycket jobbigt att gå igenom. Jag skulle hellre hämta data som den är i databasen och formatera om den i min applikationskod. Då skulle jag inte behöva använda någon dynamisk SQL för att formatera kolumnerna.



  1. MySQL-attributdatabas

  2. Hur konverterar man sträng till unicode med PostgreSQL?

  3. Oracle join-operatör

  4. Varför är MySQL:s standardsortering latin1_swedish_ci?