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

जहां क्लॉज . में 'केस एक्सप्रेशन कॉलम' का उपयोग करना

इस त्रुटि का कारण यह है कि SQL SELECT कथन तार्किक रूप से हैं ** निम्नलिखित क्रम में संसाधित:

  • FROM :एक टेबल या कई जॉइन वाले और सभी पंक्तियों के संयोजन का चयन जो ON से मेल खाते हैं शर्तें।

  • WHERE :शर्तों का मूल्यांकन किया जाता है और मेल नहीं खाने वाली पंक्तियों को हटा दिया जाता है।

  • GROUP BY :पंक्तियों को समूहीकृत किया जाता है (और प्रत्येक समूह एक पंक्ति में सिमट जाता है)

  • HAVING :शर्तों का मूल्यांकन किया जाता है और मेल नहीं खाने वाली पंक्तियों को हटा दिया जाता है।

  • SELECT :स्तंभों की सूची का मूल्यांकन किया जाता है।

  • DISTINCT :डुप्लीकेट पंक्तियों को हटा दिया जाता है (यदि यह एक SELECT DISTINCT स्टेटमेंट है)

  • UNION , EXCEPT , INTERSECT :उस ऑपरेंड की कार्रवाई उप-चयन कथनों की पंक्तियों पर की जाती है। उदाहरण के लिए, यदि यह एक यूनियन है, तो सभी उप-चयन कथनों के मूल्यांकन के बाद सभी पंक्तियों को इकट्ठा किया जाता है (और जब तक यह यूनियन ऑल नहीं है तब तक डुप्लिकेट समाप्त हो जाते हैं)। तद्नुसार EXCEPT या INTERSECT मामलों के लिए।

  • ORDER BY :पंक्तियों का आदेश दिया जाता है।

इसलिए, आप WHERE . में उपयोग नहीं कर सकते खंड, कुछ ऐसा जो अभी तक आबाद या गणना नहीं किया गया है। यह प्रश्न भी देखें:oracle-sql-clause-evaluation-order

ध्यान दें कि डेटाबेस इंजन एक क्वेरी के लिए मूल्यांकन का एक और क्रम भी चुन सकते हैं (और वे आमतौर पर यही करते हैं!) केवल प्रतिबंध यह है कि परिणाम वही होना चाहिए जैसे कि उपरोक्त आदेश का उपयोग किया गया था मजबूत> .

समाधान यह है कि क्वेरी को किसी अन्य में संलग्न करें :

SELECT *
FROM
  ( SELECT ename
         , job
         , CASE deptno
             WHEN 10 THEN 'ACCOUNTS'
             WHEN 20 THEN 'SALES'
                     ELSE 'UNKNOWN'
           END AS department
    FROM emp
  ) tmp
WHERE department = 'SALES' ;

या WHERE की स्थिति में गणना की नकल करने के लिए :

SELECT ename
     , job
     , CASE deptno
         WHEN 10 THEN 'ACCOUNTS'
         WHEN 20 THEN 'SALES'
                 ELSE 'UNKNOWN'
       END AS department
FROM emp
WHERE
    CASE deptno
      WHEN 10 THEN 'ACCOUNTS'
      WHEN 20 THEN 'SALES'
              ELSE 'UNKNOWN'
    END = 'SALES' ;

मुझे लगता है कि यह आपकी क्वेरी का एक सरलीकृत संस्करण है या आप इसका उपयोग कर सकते हैं:

SELECT ename
     , job
     , 'SALES' AS department
FROM emp
WHERE deptno = 20 ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle में एक यूनिक्स टाइमस्टैम्प को दिनांक मान में बदलें

  2. क्या Oracle पूर्ण पाठ खोज का समर्थन करता है?

  3. जब मैं बाधा का नाम नहीं जानता तो मैं ओरेकल में एक शून्य बाधा कैसे छोड़ सकता हूं?

  4. मैं Oracle में किसी तालिका में डुप्लिकेट मान कैसे प्राप्त करूं?

  5. मैं LIKE ऑपरेटर में कई शर्तें कैसे पेश कर सकता हूं?