Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL चर स्तंभ नाम के साथ क्वेरी का चयन करें

दो अलग-अलग प्रश्नों का उपयोग करना सबसे आसान समाधान है।

हम दूसरी क्वेरी के लिए 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 में सबक्वेरी सूची निष्पादित की जाती है। यदि उपश्रेणी एक अदिश मान लौटाती है, तो अदिश मान को बाहरी क्वेरी के स्तंभ के रूप में वापस कर दिया जाता है। सबक्वेरी द्वारा लौटाया गया मान एक मान है , यह कॉलम नाम के रूप में मूल्यांकन नहीं किया जाता है (और नहीं किया जा सकता है)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Qt एप्लिकेशन से ODBC के माध्यम से MySQL डेटाबेस से कैसे कनेक्ट करें?

  2. PHP और MySQL डेटाबेस का उपयोग करके टू-डू सूची एप्लिकेशन

  3. होस्ट से डॉकर कंटेनर में MySQL डंप को कैसे पुनर्स्थापित करें

  4. MySQL में डुप्लिकेट पंक्तियां हटाएं

  5. पीडीओ पर bind_result के बराबर क्या है