sql >> データベース >  >> RDS >> Oracle

混合varchar列を使用した結果のOracle順序付け、ただし数値のwhere句

    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')
    

    正確さを期すために、長さを考慮する必要があることに注意してください。



    1. Pythonを使用した公開鍵とcx_Oracleによる認証

    2. 1億件のレコードを検索するためのパフォーマンス

    3. SQLで列を追加する方法

    4. Django1.8でMySQLコネクタを使用する際の問題