O
ORDER BY
não tem nada a ver com o problema - pelo menos não diretamente. SQL em geral, e Oracle em particular, não fazem promessas sobre a ordem de avaliação das condições no
WHERE
cláusula. Portanto, o WHERE
cláusula não é (necessariamente) avaliada na ordem escrita. A presença do ORDER BY
pode afetar a ordem de avaliação das condições neste caso particular. Em geral, é uma prática muito ruim misturar tipos de dados, do jeito que você está fazendo. Mas, você pode garantir a ordem de avaliação usando
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);
Não recomendo fazer isso. Eu só quero salientar que
case
força a ordem de avaliação das condições. A solução correta é usar comparações de strings. Nesse caso, eu iria com:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Alternativamente, você poderia fazer:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Observe que, para precisão, você precisa levar em consideração o comprimento.