Мисля, че разбирам, че искате да изберете колона по име, а имената са низове във вашия TABLE_MASTER.
Не можете да направите това в една SQL заявка, защото SQL не може да избере колона с помощта на низов израз. Има разлика между низ и идентификатор. Например, това избира данни от колона по идентификатор:
SELECT header01 ...
Но следното е низов израз (прост, който е само постоянна стойност). Връща само фиксиран низ „header01“, НЕ данните от колона с това име:
SELECT 'header01' ...
По същия начин, използването на който и да е друг израз в списък за избор избира само стойността на този израз, НЕ и данните, съхранени в колона, наречена от низовата стойност на израза.
Следователно, ако искате дадена заявка да върне динамична колона, наречена от някаква друга променлива или израз, не можете да го направите в същата заявка, в която четете този израз. Трябва да форматирате нова SQL заявка от стойностите, които сте прочели. Това се нарича динамичен SQL израз (вече споменато от spencer7593, който публикува отговор, докато аз пишех собствения си отговор).
Можете да използвате своя TABLE_MASTER, за да форматирате динамичен SQL оператор, за да извлечете колони и да предефинирате техните псевдоними:
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
Резултатът от това е низ, който формира друг оператор SELECT, който преименува колоните, както желаете:
SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE
След това можете да използвате низа, съхранен в @sql
като динамична SQL заявка.
Ето процедурата, която прави това:
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 ;
Извикайте процедурата и получете резултата:
CALL MyProc();
+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01 | data02 | Paul |
| data11 | data12 | Paul |
+-----------------+-----------------+------+
Трябва да коментирам, че това е много трудност, през която трябва да се премине. Предпочитам да извлека данните така, както са в базата данни, и да ги преформатирам в кода на приложението си. Тогава няма да се налага да използвам динамичен SQL за форматиране на колоните.