ORDER BY
har inget med problemet att göra -- åtminstone inte direkt.
SQL i allmänhet, och Oracle i synnerhet, ger inga löften om ordningen för utvärdering av villkor i WHERE
klausul. Därför WHERE
klausulen utvärderas inte (nödvändigtvis) i den ordning som skrivs. Förekomsten av ORDER BY
kan påverka ordningen för utvärderingen av förhållandena i detta särskilda fall.
I allmänhet är det riktigt dålig praxis att blanda datatyper, på det sätt som du gör det. Men du kan garantera utvärderingsordningen genom att använda 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);
Jag rekommenderar inte att du gör detta. Jag vill bara påpeka det case
tvingar fram ordningen för utvärdering av villkoren.
Den korrekta lösningen är att använda strängjämförelser. I det här fallet skulle jag gå med:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Alternativt kan du göra:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Observera att du måste ta hänsyn till längden för noggrannhet.