Myślę, że rozumiem, że chcesz wybrać kolumnę według nazwy, a nazwy są ciągami w TABLE_MASTER.
Nie można tego zrobić w pojedynczym zapytaniu SQL, ponieważ SQL nie może wybrać kolumny za pomocą wyrażenia ciągu. Istnieje różnica między ciągiem a identyfikatorem. Na przykład wybiera dane z kolumny według identyfikatora:
SELECT header01 ...
Ale poniżej jest wyrażenie tekstowe (proste, które jest po prostu wartością stałą). Zwraca tylko stały ciąg 'header01', NIE dane z kolumny o tej nazwie:
SELECT 'header01' ...
Podobnie, użycie dowolnego innego wyrażenia z listy wyboru wybiera tylko wartość tego wyrażenia, a NIE dane przechowywane w kolumnie nazwanej wartością ciągu wyrażenia.
Dlatego jeśli chcesz, aby zapytanie zwracało kolumnę dynamiczną o nazwie innej zmiennej lub wyrażenia, nie możesz tego zrobić w tym samym zapytaniu, w którym odczytujesz to wyrażenie. Musisz sformatować nowe zapytanie SQL z odczytanych wartości. Nazywa się to dynamiczną instrukcją SQL (wspomniany już przez spencer7593, który opublikował odpowiedź, gdy pisałem własną odpowiedź).
Możesz użyć swojego TABLE_MASTER do sformatowania dynamicznej instrukcji SQL w celu pobrania kolumn i przedefiniowania ich aliasów:
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
Wynikiem tego jest łańcuch, który tworzy kolejną instrukcję SELECT, która zmienia nazwy kolumn według potrzeb:
SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE
Następnie możesz użyć ciągu zapisanego w @sql
jako dynamiczne zapytanie SQL.
Oto procedura, która to robi:
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 ;
Wywołaj procedurę i uzyskaj wynik:
CALL MyProc();
+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01 | data02 | Paul |
| data11 | data12 | Paul |
+-----------------+-----------------+------+
Muszę skomentować, że jest to wiele kłopotów. Wolałbym pobrać dane tak, jak są w bazie danych i przeformatować je w kodzie aplikacji. Wtedy nie musiałbym używać żadnego dynamicznego SQL do formatowania kolumn.