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

Omdøbning af kolonnerne i en tabelkolonner i henhold til en mapping defineret i en anden tabel - med MYSQL

Jeg tror, ​​jeg forstår, at du vil vælge en kolonne efter navn, og navnene er strenge i din TABLE_MASTER.

Du kan ikke gøre dette i en enkelt SQL-forespørgsel, fordi SQL ikke kan vælge en kolonne ved at bruge et strengudtryk. Der er forskel på en streng og en identifikator. For eksempel vælger dette data fra en kolonne efter identifikator:

SELECT header01 ...
 

Men det følgende er et strengudtryk (et simpelt, som kun er en konstant værdi). Det returnerer kun en fast streng 'header01', IKKE dataene fra en kolonne med det navn:

SELECT 'header01' ...
 

Ligeledes vælger brug af ethvert andet udtryk i en valgliste kun værdien af ​​det udtryk, IKKE dataene, der er gemt i en kolonne navngivet af udtrykkets strengværdi.

Derfor, hvis du ønsker, at en forespørgsel skal returnere en dynamisk kolonne, der er navngivet af en anden variabel eller et andet udtryk, kan du ikke gøre det i den samme forespørgsel, hvor du læste det udtryk. Du skal formatere en ny SQL-forespørgsel ud fra de værdier, du læser. Dette kaldes en dynamisk SQL-sætning (allerede nævnt af spencer7593, som postede et svar, mens jeg skrev mit eget svar).

Du kan bruge din TABLE_MASTER til at formatere en dynamisk SQL-sætning for at hente kolonner og omdefinere deres alias:

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

Resultatet af dette er en streng, der danner en anden SELECT-sætning, denne omdøber kolonnerne, som du vil:

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

Så kan du bruge strengen gemt i @sql som en dynamisk SQL-forespørgsel.

Her er proceduren, der gør dette:

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 til proceduren og få resultatet:

CALL MyProc();

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

Jeg må sige, at det er en masse besvær at gå igennem. Jeg vil hellere hente dataene, som de er i databasen, og omformatere dem i min applikationskode. Så skulle jeg ikke bruge nogen dynamisk SQL til at formatere kolonnerne.



  1. simpel sql-forespørgsel, kombiner resultater og divider

  2. Opdatering af div ved knapklik, når knappen genereres ved at klikke på en anden knap

  3. Adgang til URL-parametre i Oracle Forms / OC4J

  4. Beregn 1 uge før sidste søndag og fra i dag til sidste søndag