दो अलग-अलग प्रश्नों का उपयोग करना सबसे आसान समाधान है।
हम दूसरी क्वेरी के लिए SQL टेक्स्ट को गतिशील रूप से जेनरेट करने के लिए पहली क्वेरी के परिणाम का उपयोग करते हैं।
mysql> SET @colname := '' ;
mysql> SELECT t.rslt FROM table1 t WHERE t.id = 1 ORDER BY t.rslt LIMIT 1 INTO @colname ;
mysql> SET @sql := CONCAT('SELECT `',@colname,'` FROM table2 ORDER BY 1') ;
mysql> PREPARE stmt FROM @sql ;
mysql> EXECUTE stmt ;
mysql> DEALLOCATE PREPARE stmt ;
एन.बी. @colname
. सहित SQL पाठ के भाग के रूप में, गतिशील रूप से तैयार SQL, एक संभावित SQL इंजेक्शन भेद्यता है।
यदि आवश्यकता एक एकल . के संदर्भ में कुछ ऐसा ही करने की है SQL कथन, फिर कथन को तालिका 1 से क्वेरी के लिए संभावित मानों को वापस करने का अनुमान लगाने की आवश्यकता है, और तालिका 2 से संभावित कॉलम के स्पष्ट संदर्भ शामिल हैं। उदाहरण के लिए, कुछ इस तरह:
SELECT CASE ( SELECT t.rslt FROM table1 t WHERE t.id = 1 LIMIT 1 )
WHEN 'r1' THEN r.r1
WHEN 'r2' THEN r.r2
WHEN 'r3' THEN r.r3
ELSE NULL
END AS c2
FROM table2 r
ORDER BY ...
यह आवश्यक रूप से क्वेरी लिखने का सबसे कारगर तरीका नहीं है, लेकिन यह पैटर्न को प्रदर्शित करता है।
SQL कथन के भीतर, पहचानकर्ता (तालिका नाम, स्तंभ नाम, फ़ंक्शन नाम) को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए; इन्हें रन टाइम पर गतिशील रूप से प्राप्त नहीं किया जा सकता है। इसका कारण यह है कि SQL कथनों को कैसे संसाधित किया जाता है... सिंटैक्स के लिए SQL पाठ को पार्स करना, फिर शब्दार्थ (वैध संदर्भ और विशेषाधिकार) के लिए पार्स करना, उपलब्ध पहुँच पथों के लिए सापेक्ष लागत का मूल्यांकन करना, एक निष्पादन योजना का चयन करना और फिर उस योजना को क्रियान्वित करना।पी>
अर्थात्, इस SQL के साथ देखा गया व्यवहार वही है जिसकी हम अपेक्षा करते हैं:
SELECT (SELECT rslt FROM table1 WHERE id = 1) FROM table2
SQL टेक्स्ट तैयार किया जाता है, और निष्पादन समय पर, तालिका 2 में प्रत्येक पंक्ति के लिए, SELECT
में सबक्वेरी सूची निष्पादित की जाती है। यदि उपश्रेणी एक अदिश मान लौटाती है, तो अदिश मान को बाहरी क्वेरी के स्तंभ के रूप में वापस कर दिया जाता है। सबक्वेरी द्वारा लौटाया गया मान एक मान है , यह कॉलम नाम के रूप में मूल्यांकन नहीं किया जाता है (और नहीं किया जा सकता है)।