ORDER BY
nie ma nic wspólnego z problemem - przynajmniej nie bezpośrednio.
SQL ogólnie, a Oracle w szczególności, nie obiecują kolejności oceny warunków w WHERE
klauzula. Stąd WHERE
klauzula nie jest (koniecznie) oceniana w pisemnej kolejności. Obecność ORDER BY
może mieć wpływ na kolejność oceny warunków w tym konkretnym przypadku.
Ogólnie rzecz biorąc, mieszanie typów danych w sposób, w jaki to robisz, jest naprawdę złą praktyką. Ale możesz zagwarantować kolejność oceny, używając 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);
Nie polecam tego robić. Chcę tylko zaznaczyć, że case
wymusza kolejność oceny warunków.
Poprawnym rozwiązaniem jest użycie porównań ciągów. W takim przypadku wybrałbym:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Alternatywnie możesz zrobić:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Pamiętaj, że dla dokładności musisz wziąć pod uwagę długość.