Il ORDER BY
non ha nulla a che fare con il problema, almeno non direttamente.
SQL in generale, e Oracle in particolare, non fanno promesse sull'ordine di valutazione delle condizioni nel WHERE
clausola. Quindi, il WHERE
clausola non è (necessariamente) valutata nell'ordine scritto. La presenza del ORDER BY
potrebbe influenzare l'ordine di valutazione delle condizioni in questo caso particolare.
In generale, è davvero una cattiva pratica mescolare i tipi di dati, nel modo in cui lo stai facendo. Tuttavia, puoi garantire l'ordine di valutazione utilizzando 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);
Non consiglio di farlo. Voglio solo sottolineare quel case
forza l'ordine di valutazione delle condizioni.
La soluzione corretta è utilizzare i confronti di stringhe. In questo caso, andrei con:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
In alternativa, potresti fare:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Tieni presente che per la precisione devi tenere conto della lunghezza.