从varchar2列中选择带有数值的值有时会产生无效的数字错误

时间:2010-05-11 06:57:03

标签: sql oracle ora-01722

我试图理解为什么在某些系统上,当我尝试从varchar2列中选择一个值时,我得到一个无效的数字错误消息,而在其他系统上,我没有得到错误同样的事情。

表格是这样的:

ID   Column_1  Column_2
 1         V     text
 2         D        1
 3         D        2
 4         D        3

和查询:

select ID
  from table
 where column_1='D'
   and column_2 = :some_number_value

:some_number_value始终为数字,但可以为null。

我们修复了查询:

select ID
  from table
 where column_1='D'
   and column_2 = to_char(:some_number_value)

此原始查询在大多数系统上运行良好,但在某些系统上会出现“无效数字”错误。问题是为什么?为什么它适用于大多数系统而不适用于某些系统?

1 个答案:

答案 0 :(得分:3)

这取决于检查条件的顺序。如果首先评估column_1的条件,则column_2到数字的隐式转换有效。如果首先检查column_2,则text到数字的转换将失败。

优化程序决定评估条件的顺序。例如,如果您在column_2上有索引但在column_1上没有索引,则可能会使用此索引,因此转换将失败。


你的意思是“some_number_value总是数字,但可以为null”?对column_2 = NULL的检查不会返回任何行,NULL只能使用IS NULL而不是= NULL进行评估。