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')
ध्यान दें कि सटीकता के लिए आपको लंबाई को ध्यान में रखना होगा।