ORDER BY
問題とは何の関係もありません-少なくとも直接ではありません。
SQL全般、特にOracleは、WHERE
での条件の評価の順序について何も約束していません。 句。したがって、WHERE
条項は(必然的に)書かれた順序で評価されません。 ORDER BY
の存在 この特定のケースでは、条件の評価の順序に影響を与える可能性があります。
一般に、データ型を混合することは、実際には悪い習慣です。ただし、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);
これを行うことはお勧めしません。 そのcase
を指摘したいだけです 条件の評価の順序を強制します。
正しい解決策は、文字列比較を使用することです。この場合、私は次のようになります:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
または、次のようにすることもできます。
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
正確さを期すために、長さを考慮する必要があることに注意してください。