Ik denk dat ik begrijp dat je een kolom op naam wilt selecteren, en de namen zijn tekenreeksen in je TABLE_MASTER.
U kunt dit niet in één SQL-query doen, omdat SQL geen kolom kan selecteren met behulp van een tekenreeksexpressie. Er is een verschil tussen een string en een identifier. Dit selecteert bijvoorbeeld gegevens uit een kolom op ID:
SELECT header01 ...
Maar het volgende is een tekenreeksuitdrukking (een eenvoudige, die slechts een constante waarde is). Het retourneert alleen een vaste tekenreeks 'header01', NIET de gegevens uit een kolom met die naam:
SELECT 'header01' ...
Evenzo selecteert het gebruik van een andere uitdrukking in een selectielijst alleen de waarde van die uitdrukking, NIET de gegevens die zijn opgeslagen in een kolom die wordt genoemd door de tekenreekswaarde van de uitdrukking.
Als u dus wilt dat een query een dynamische kolom retourneert die wordt genoemd door een andere variabele of expressie, kunt u dit niet doen in dezelfde query waarin u die expressie leest. U moet een nieuwe SQL-query opmaken op basis van de waarden die u leest. Dit heet een dynamische SQL-instructie (reeds genoemd door spencer7593, die een antwoord plaatste terwijl ik mijn eigen antwoord aan het schrijven was).
U kunt uw TABLE_MASTER gebruiken om een dynamische SQL-instructie op te maken om kolommen op te halen en hun alias opnieuw te definiëren:
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
Het resultaat hiervan is een string die een andere SELECT-instructie vormt, deze hernoemt de kolommen zoals u wilt:
SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE
Dan kun je de string gebruiken die is opgeslagen in @sql
als een dynamische SQL-query.
Dit is de procedure die dit doet:
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 ;
Roep de procedure aan en krijg het resultaat:
CALL MyProc();
+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01 | data02 | Paul |
| data11 | data12 | Paul |
+-----------------+-----------------+------+
Ik moet zeggen dat dit veel moeite kost. Ik zou liever de gegevens ophalen zoals deze zich in de database bevinden en deze opnieuw formatteren in mijn applicatiecode. Dan zou ik geen dynamische SQL hoeven te gebruiken om de kolommen op te maken.