Le ORDER BY
n'a rien à voir avec le problème -- du moins pas directement.
SQL en général, et Oracle en particulier, ne font aucune promesse quant à l'ordre d'évaluation des conditions dans le WHERE
clause. Par conséquent, le WHERE
clause n'est pas (nécessairement) évaluée dans l'ordre écrit. La présence du ORDER BY
pourrait affecter l'ordre d'évaluation des conditions dans ce cas particulier.
En général, c'est vraiment une mauvaise pratique de mélanger les types de données, comme vous le faites. Mais, vous pouvez garantir l'ordre d'évaluation en utilisant 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);
Je ne recommande pas de faire cela. Je veux seulement souligner ce case
force l'ordre d'évaluation des conditions.
La bonne solution consiste à utiliser des comparaisons de chaînes. Dans ce cas, j'irais avec :
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Alternativement, vous pouvez faire :
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Notez que pour plus de précision, vous devez tenir compte de la longueur.