De ORDER BY
heeft niets met het probleem te maken -- althans niet rechtstreeks.
SQL in het algemeen, en Oracle in het bijzonder, doen geen beloftes over de volgorde van evaluatie van voorwaarden in de WHERE
clausule. Vandaar dat de WHERE
clausule wordt niet (noodzakelijkerwijs) geëvalueerd in de geschreven volgorde. De aanwezigheid van de ORDER BY
kan de volgorde van evaluatie van de voorwaarden in dit specifieke geval beïnvloeden.
Over het algemeen is het echt een slechte gewoonte om gegevenstypen te mixen, zoals u het doet. Maar u kunt de volgorde van evaluatie garanderen door case
. te gebruiken :
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);
Ik raad het niet aan om dit te doen. Ik wil er alleen op wijzen dat case
dwingt de volgorde van evaluatie van de voorwaarden.
De juiste oplossing is om stringvergelijkingen te gebruiken. In dit geval zou ik gaan voor:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
U kunt ook het volgende doen:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Merk op dat je voor nauwkeurigheid wel rekening moet houden met de lengte.