Oracle 在条件中,类型cast似乎是错误的

Oracle 在条件中,类型cast似乎是错误的,oracle,Oracle,我有一张带有列ErrorID的表。由于历史原因,此ID为Tye VARCHAR2 30 CHAR,并对应用程序运行时发生的错误类型进行编码 ErrorID | Meaning ------------------------ 01 | no error 02 | wrong password ... 99 | unknown ERROR | unknown 为了检查是否发生了严重错误,我使用以下查询: SELECT ThreadID, CASE WHEN Er

我有一张带有列ErrorID的表。由于历史原因,此ID为Tye VARCHAR2 30 CHAR,并对应用程序运行时发生的错误类型进行编码

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
结果总是否。如果我将查询更改为

SELECT ThreadID, CASE WHEN ErrorID IN (05, 06) THEN 'Yes' ELSE 'NO' END AS "Critical"
FROM ErrorTable
结果是正确的,即在正确的线程上是和否

我已经读到,Oracle将对数字数据类型强制转换“10”,如果它出现在数字表达式中,但在我的例子中,ErrorID是一个VARCHAR2,它可以是一个实字符串,请参见示例表中的最后一项

为什么甲骨文会这样做?我认为这是非常危险的,因为我告诉我的客户在测试期间没有出现严重错误,尽管他们确实

更新 正如评论中所希望的,这里是实际输出。由于数据保护法,限制了感兴趣的列:

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

Oracle数据库的行为与您断言的不同。在'05','06'将匹配相关行。在05,06将抛出ORA-01722,因为“错误”不能转换为数字

最可能的解释是错误ID不是您所认为的。也许你有尾随空格?”05 ' != '05'. 尽管您仍然应该得到ORA-01722错误


如果这对您没有帮助,您需要发布一个可复制的测试用例:表结构、样本数据、一个说明问题的查询。

您确定始终存在al前导零吗?因为比较'05','06'中的'5'将返回false,而'5','6'中的'5'将返回true。是的,有。从错误表中选择*始终显示前导0。另外,对“5”中的ErrorID进行更改,“6”将始终返回Now您使用的Oracle版本是什么?我做了一个简单的测试,它对我起了作用:Oracle Database 11g Enterprise Edition 11.2.0.4.0-64位生产PL/SQL 11.2.0.4.0-用于Solaris的生产核心11.2.0.4.0生产TNS:11.2.0.4.0版-生产NLSRTL 11.2.0.4.0版-生产您完全正确!!!错误ID为“01”,带有空格。这在SQLDeveloper输出中看不到,是一个可怕的数据库设计。。。未抛出ORA-01722,因为错误ID未出现在当前数据中。非常感谢你。