ORDER BY
nemá s problémem nic společného – alespoň ne přímo.
SQL obecně, a Oracle konkrétně, neslibují pořadí hodnocení podmínek v WHERE
doložka. Proto WHERE
doložka není (nutně) hodnocena v sepsaném pořadí. Přítomnost ORDER BY
může ovlivnit pořadí hodnocení podmínek v tomto konkrétním případě.
Obecně je opravdu špatná praxe míchat datové typy způsobem, jakým to děláte. Pořadí hodnocení však můžete zaručit pomocí 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);
Toto nedoporučuji. Chci pouze poukázat na tento case
vynucuje pořadí hodnocení podmínek.
Správným řešením je použití porovnávání řetězců. V tomto případě bych zvolil:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Případně můžete udělat:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Všimněte si, že pro přesnost musíte vzít v úvahu délku.