1

我试图理解为什么在某些系统上,当我尝试从 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

:som​​e_number_value 始终为数字,但可以为空。

我们已经修复了查询:

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

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

4

1 回答 1

3

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

优化器决定评估条件的顺序。例如,如果您有一个索引打开column_2但未打开column_1,则可能会使用该索引,因此转换将失败。


“some_number_value 始终是数字但可以为空”是什么意思?检查column_2 = NULL不会返回任何行,NULL只能使用IS NULL, not进行评估= NULL

于 2010-05-11T07:13:11.153 回答