Tôi nghĩ rằng tôi hiểu bạn muốn chọn một cột theo tên và các tên là chuỗi trong TABLE_MASTER của bạn.
Bạn không thể thực hiện điều này trong một truy vấn SQL duy nhất, vì SQL không thể chọn một cột bằng cách sử dụng biểu thức chuỗi. Có sự khác biệt giữa một chuỗi và một số nhận dạng. Ví dụ:điều này chọn dữ liệu từ một cột theo số nhận dạng:
SELECT header01 ...
Nhưng sau đây là một biểu thức chuỗi (một biểu thức đơn giản, chỉ là một giá trị không đổi). Nó chỉ trả về một chuỗi cố định 'header01', KHÔNG phải dữ liệu từ một cột có tên đó:
SELECT 'header01' ...
Tương tự như vậy, việc sử dụng bất kỳ biểu thức nào khác trong danh sách chọn chỉ chọn giá trị của biểu thức đó, KHÔNG phải dữ liệu được lưu trữ trong cột được đặt tên bằng giá trị chuỗi của biểu thức.
Do đó, nếu bạn muốn truy vấn trả về một cột động được đặt tên bởi một số biến hoặc biểu thức khác, bạn không thể thực hiện điều đó trong cùng một truy vấn nơi bạn đọc biểu thức đó. Bạn phải định dạng một truy vấn SQL mới từ các giá trị bạn đọc. Đây được gọi là câu lệnh SQL động (đã được đề cập bởi spencer7593, người đã đăng câu trả lời trong khi tôi đang viết câu trả lời của riêng mình).
Bạn có thể sử dụng TABLE_MASTER của mình để định dạng một câu lệnh SQL động nhằm tìm nạp các cột và xác định lại bí danh của chúng:
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
Kết quả của việc này là một chuỗi tạo thành một câu lệnh SELECT khác, câu lệnh này đổi tên các cột như bạn muốn:
SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE
Sau đó, bạn có thể sử dụng chuỗi được lưu trữ trong @sql
dưới dạng truy vấn SQL động.
Đây là quy trình thực hiện điều này:
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 ;
Gọi thủ tục và nhận kết quả:
CALL MyProc();
+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01 | data02 | Paul |
| data11 | data12 | Paul |
+-----------------+-----------------+------+
Tôi phải nhận xét rằng điều này là rất nhiều rắc rối để trải qua. Tôi muốn tìm nạp dữ liệu như trong cơ sở dữ liệu và định dạng lại nó trong mã ứng dụng của mình. Sau đó, tôi sẽ không phải sử dụng bất kỳ SQL động nào để định dạng các cột.