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

मिश्रित वर्चर कॉलम का उपयोग करके परिणामों का ओरेकल ऑर्डर करना लेकिन संख्यात्मक जहां क्लॉज

ORDER BY इसका समस्या से कोई लेना-देना नहीं है -- कम से कम सीधे तौर पर तो नहीं।

सामान्य तौर पर SQL, और विशेष रूप से Oracle, WHERE में स्थितियों के मूल्यांकन के क्रम के बारे में कोई वादा नहीं करते हैं खंड। इसलिए, WHERE लिखित क्रम में खंड (आवश्यक) का मूल्यांकन नहीं किया गया है। ORDER BY . की उपस्थिति इस विशेष मामले में शर्तों के मूल्यांकन के क्रम को प्रभावित कर सकता है।

सामान्य तौर पर, डेटा प्रकारों को मिलाना वास्तव में खराब अभ्यास है, जिस तरह से आप इसे कर रहे हैं। लेकिन, आप case . का उपयोग करके मूल्यांकन के क्रम की गारंटी दे सकते हैं :

select *
from   TABLE
where  CLASS = 3 
       'true' = (case when class <> 3 then 'false'
                      when (CODE >= 210 and CODE < 220) or CODE = 291) then 'true'
                 end);

मैं ऐसा करने की अनुशंसा नहीं करता। मैं केवल यह बताना चाहता हूं कि case शर्तों के मूल्यांकन के आदेश को बाध्य करता है।

स्ट्रिंग तुलनाओं का उपयोग करने का सही समाधान है। इस मामले में, मैं इसके साथ जाऊंगा:

select *
from   TABLE
where  CLASS = 3 AND
       CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')

वैकल्पिक रूप से, आप यह कर सकते हैं:

where  CLASS = 3 and length(CODE) = 3 and
       ((CODE >= '210' and CODE < '220') or CODE = '291')

ध्यान दें कि सटीकता के लिए आपको लंबाई को ध्यान में रखना होगा।



  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 ODP.NET कनेक्शन स्ट्रिंग:डेटा स्रोत में क्या होता है?

  2. इकाई फ्रेमवर्क डेटाबेस-पहले Oracle डाटाबेस के साथ

  3. मैं तत्काल कथन निष्पादित करने में बाइंड वैरिएबल का उपयोग क्यों नहीं कर सकता?

  4. बड़ी डीबी तालिका के लिए एसक्यूएल अनुकूलक

  5. समूह द्वारा एसक्यूएल गिनती