2017-08-08 9 views
-2

私はカラムがあるテーブル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 

にクエリを変更した場合の結果は、すなわち、右のスレッドでYesNo正しいです。

私はそれが数値表現で表示されますが、私の場合には、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 
+0

ゼロを先頭に常にゼロがありますか? '5' IN( '05'、 '06')を比較するとfalseが返されるため、 '5' IN( '5'、 '6')はtrueを返します。 – fhossfel

+0

はい、あります。 'SELECT * FROM ErrorTable'は常に先頭に0を表示します。また、' ErrorID IN( '5'、 '6') 'に変更すると常に' No'が返されます。 – Thanthla

+0

どのOracleのバージョンを使用していますか?私は簡単なテストを行い、それは私のために働いた:http://sqlfiddle.com/#!4/09e90/1 –

答えて

0

Oracleデータベースが動作しません。 in ('05', '06')は該当行と一致します。 は数値にキャストできないため、in (05, 06)はORA-01722を発行します。

最も可能性の高い説明は、エラーIDがあなたの考えではないということです。恐らく後にスペースがありますか? '05 ' != '05'。 ORA-01722エラーが発生します。


これはあなたが再現可能なテストケース掲示する必要が解決しない場合:テーブル構造、サンプルデータ、問題を示しクエリを。

+1

あなたは完全に正しかったです! ErrorIDは'01 '(スペース付き)でした。これはSQLDeveloperの出力には表示されず、恐ろしいデータベース設計です... ORA-01722は投げられませんでした。なぜなら、 'ERROR' IDが現在のデータに現れなかったからです。どうもありがとうございました。 – Thanthla

関連する問題