我试图理解为什么在某些系统上,当我尝试从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)
此原始查询在大多数系统上运行良好,但在某些系统上会出现“无效数字”错误。问题是为什么?为什么它适用于大多数系统而不适用于某些系统?
答案 0 :(得分:3)
这取决于检查条件的顺序。如果首先评估column_1
的条件,则column_2
到数字的隐式转换有效。如果首先检查column_2
,则text
到数字的转换将失败。
优化程序决定评估条件的顺序。例如,如果您在column_2
上有索引但在column_1
上没有索引,则可能会使用此索引,因此转换将失败。
你的意思是“some_number_value总是数字,但可以为null”?对column_2 = NULL
的检查不会返回任何行,NULL
只能使用IS NULL
而不是= NULL
进行评估。