Oracle 错误ORA-01722不一致:无效数字

Oracle 错误ORA-01722不一致:无效数字,oracle,Oracle,当我执行查询时,我收到一个错误消息“ORA-01722:无效号码”。正如在中所述,我发现,当我为一个需要varchar的列使用一个数值时,就会出现这个错误。 在我的例子中,我的查询有一个case语句,如 CASE WHEN CHAR_COLUMN= 1 THEN 'SOME VALUE' END 但在同一oracle版本的不同实例中,行为是不同的。同一个查询在我们的一个dev-oracle服务器中有效,但在另一个服务器中无效。我很好奇是否有任何配置允许oracle在字符列中使用数值 PS:我们

当我执行查询时,我收到一个错误消息“ORA-01722:无效号码”。正如在中所述,我发现,当我为一个需要
varchar
的列使用一个数值时,就会出现这个错误。 在我的例子中,我的查询有一个case语句,如

CASE WHEN CHAR_COLUMN= 1 THEN 'SOME VALUE' END
但在同一oracle版本的不同实例中,行为是不同的。同一个查询在我们的一个dev-oracle服务器中有效,但在另一个服务器中无效。我很好奇是否有任何配置允许oracle在字符列中使用数值

PS:我们使用的oracle版本是oracle Database 11g Express Edition 11.2.0.2.0版-64位生产版

我从不依赖,但始终明确:

CASE WHEN CHAR_COLUMN = TO_CHAR(1) THEN 'SOME VALUE' END
甚至根本不转换:

CASE WHEN CHAR_COLUMN = '1' THEN 'SOME VALUE' END
原因是Oracle倾向于将字符串转换为数字,而不是相反。请参见链接手册页面中的示例:

文本文字示例

文本文字“10”具有数据类型CHAR。如果它出现在数字表达式中,则Oracle会将其隐式转换为数字数据类型,如以下语句所示:

SELECT salary + '10'
  FROM employees;
致:

然后,当查询数值
1
时,第一个查询表工作,第二个不工作:

select * from foo where CHAR_COLUMN = 1;
select * from bar where CHAR_COLUMN = 1;
当您要求Oracle解决此比较时:

WHEN CHAR_COLUMN = 1
。。。Oracle在内部将查询转换为:

WHEN TO_NUMBER(CHAR_COLUMN) = 1
在我的示例中,这可以在解释计划中发现:

---------------------------------------------------------------------
| Id  | Operation           | Name | Rows | Bytes | Cost | Time     |
---------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    1 |     7 |    3 | 00:00:01 |
| * 1 |   TABLE ACCESS FULL | FOO  |    1 |     7 |    3 | 00:00:01 |
---------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter(TO_NUMBER("CHAR_COLUMN")=1)

这两个服务器可能只是拥有不同的数据,而您的dev服务器没有任何带有非数字字符串的行?
---------------------------------------------------------------------
| Id  | Operation           | Name | Rows | Bytes | Cost | Time     |
---------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    1 |     7 |    3 | 00:00:01 |
| * 1 |   TABLE ACCESS FULL | FOO  |    1 |     7 |    3 | 00:00:01 |
---------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter(TO_NUMBER("CHAR_COLUMN")=1)