El ORDER BY
no tiene nada que ver con el problema, al menos no directamente.
SQL en general, y Oracle en particular, no hacen ninguna promesa sobre el orden de evaluación de las condiciones en WHERE
cláusula. Por lo tanto, el WHERE
La cláusula no se evalúa (necesariamente) en el orden escrito. La presencia del ORDER BY
podría afectar el orden de evaluación de las condiciones en este caso particular.
En general, es realmente una mala práctica mezclar tipos de datos, de la forma en que lo está haciendo. Pero puede garantizar el orden de evaluación 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);
No recomiendo hacer esto. Solo quiero señalar ese case
fuerza el orden de evaluación de las condiciones.
La solución correcta es usar comparaciones de cadenas. En este caso, iría con:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Alternativamente, podrías hacer:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Tenga en cuenta que, para obtener precisión, debe tener en cuenta la longitud.