ORDER BY
har intet med problemet at gøre -- i hvert fald ikke direkte.
SQL generelt, og Oracle i særdeleshed, giver ingen løfter om rækkefølgen af evaluering af betingelser i WHERE
klausul. Derfor er WHERE
klausul vurderes ikke (nødvendigvis) i den rækkefølge, der er skrevet. Tilstedeværelsen af ORDER BY
kan påvirke rækkefølgen af vurdering af forholdene i dette særlige tilfælde.
Generelt er det virkelig dårlig praksis at blande datatyper, sådan som du gør det. Men du kan garantere rækkefølgen af evalueringen ved at bruge 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);
Jeg anbefaler ikke at gøre dette. Jeg vil kun påpege det case
fremtvinger rækkefølgen af evaluering af betingelserne.
Den korrekte løsning er at bruge strengsammenligninger. I dette tilfælde ville jeg gå med:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Alternativt kan du gøre:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Bemærk, at du for nøjagtigheden skal tage højde for længden.