私はカラムがあるテーブルErrorID
を持っています。歴史的な理由から、このIDはTye VARCHAR2 (30 CHAR)
であり、アプリケーションのランタイム中に発生したエラーの種類をエンコードします。重大なエラーが発生しているかどうかをチェックするためにIN条件タイプキャストが間違っているようです
ErrorID | Meaning
------------------------
01 | no error
02 | wrong password
...
99 | unknown
ERROR | unknown
、私は次のクエリを使用します。
SELECT ThreadID, CASE WHEN ErrorID IN ('05','06') THEN 'Yes' ELSE 'NO' END AS "Critical"
FROM ErrorTable
結果は常にNo
です。私は
SELECT ThreadID, CASE WHEN ErrorID IN (05, 06) THEN 'Yes' ELSE 'NO' END AS "Critical"
FROM ErrorTable
にクエリを変更した場合の結果は、すなわち、右のスレッドでYes
とNo
正しいです。
私はそれが数値表現で表示されますが、私の場合には、ErrorID
は本当の文字列(例えば、テーブルの最後のエントリを参照)することができVARCHAR2
であれば、Oracleは、'10'
NUMBER
へのデータ型にキャストすることを、読みました。
Oracleはなぜこのように動作しますか?私はそれが非常に危険な、私は言いました原因だと思う私の顧客彼らがしたものの、「テスト中にaccouredなし重大なエラー」...
としては、ここでコメント、実際の出力に望んだUPDATE。データ保護法には、目的の列を制限:あなたが主張するよう
DESC ErrorTable
Name Null Typ
---------------------------- -------- -------------------
ThreadID NOT NULL NUMBER(38)
...
ErrorID VARCHAR2(30 CHAR)
SELECT * FROM ErrorTable WHERE ThreadID = 8917
THREADID | ... | ERRORID
------------------------
8917 | ... | 01
SELECT ThreadID, CASE WHEN ErrorID IN ('1','01') THEN 'Yes' ELSE 'No' END AS "Critical" FROM ErrorTable WHERE ThreadID = 8917;
THREADID | CRITICAL
--------------------
8917 | No
SELECT ThreadID, CASE WHEN ErrorID IN (01) THEN 'Yes' ELSE 'No' END AS "Critical" FROM ErrorTable WHERE ThreadID = 8917;
THREADID | CRITICAL
------------------------
8917 | Yes
ゼロを先頭に常にゼロがありますか? '5' IN( '05'、 '06')を比較するとfalseが返されるため、 '5' IN( '5'、 '6')はtrueを返します。 – fhossfel
はい、あります。 'SELECT * FROM ErrorTable'は常に先頭に0を表示します。また、' ErrorID IN( '5'、 '6') 'に変更すると常に' No'が返されます。 – Thanthla
どのOracleのバージョンを使用していますか?私は簡単なテストを行い、それは私のために働いた:http://sqlfiddle.com/#!4/09e90/1 –