मुझे लगता है कि मैं समझता हूं कि आप नाम से एक कॉलम चुनना चाहते हैं, और नाम आपके TABLE_MASTER में स्ट्रिंग हैं।
आप इसे किसी एकल SQL क्वेरी में नहीं कर सकते, क्योंकि SQL स्ट्रिंग व्यंजक का उपयोग करके किसी स्तंभ का चयन नहीं कर सकता है। एक स्ट्रिंग और एक पहचानकर्ता के बीच अंतर है। उदाहरण के लिए, यह पहचानकर्ता द्वारा कॉलम से डेटा का चयन करता है:
SELECT header01 ...
लेकिन निम्नलिखित एक स्ट्रिंग अभिव्यक्ति है (एक साधारण एक, जो केवल एक स्थिर मान है)। यह केवल एक निश्चित स्ट्रिंग 'हेडर01' देता है, उस नाम के कॉलम से डेटा नहीं:
SELECT 'header01' ...
इसी तरह, चयन-सूची में किसी अन्य अभिव्यक्ति का उपयोग केवल उस अभिव्यक्ति के मूल्य का चयन करता है, न कि अभिव्यक्ति के स्ट्रिंग मान द्वारा नामित कॉलम में संग्रहीत डेटा।
इसलिए यदि आप चाहते हैं कि कोई क्वेरी किसी अन्य वेरिएबल या एक्सप्रेशन द्वारा नामित डायनेमिक कॉलम लौटाए, तो आप इसे उसी क्वेरी में नहीं कर सकते जहां आप उस एक्सप्रेशन को पढ़ते हैं। आपको अपने द्वारा पढ़े गए मानों से एक नई SQL क्वेरी को प्रारूपित करना होगा। इसे गतिशील SQL कथन . कहा जाता है (पहले से ही स्पेंसर7593 द्वारा उल्लेख किया गया है, जिन्होंने अपना उत्तर लिखते समय एक उत्तर पोस्ट किया था)।
कॉलम लाने और उनके उपनाम को फिर से परिभाषित करने के लिए आप अपने 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 का उपयोग नहीं करना पड़ेगा।