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')
Имайте предвид, че за точност трябва да вземете предвид дължината.