我有一个Oracle表,一列(col1
)的类型为varchar2(12 byte)
。它有一行,col1
的值为1234
当我说
时select * from table where col1 = 1234
Oracle说无效号码。这是为什么?为什么我varchar2
时无法传递数字?
1234
是有效的varchar2数据类型时,我无法理解为什么它不会1234
。
答案 0 :(得分:5)
问题是您希望Oracle将隐式地将1234转换为字符类型。相反,Oracle隐式地将列转换为数字。列中存在非数字值,因此Oracle会引发错误。 Oracle documentation在它解释如何解决之前就警告反对隐式演员。解释您所看到的行为的规则是:
将字符值与数值进行比较时,Oracle会将字符数据转换为数值。
答案 1 :(得分:4)
哦,转换为char而不是数字要好得多:
select *
from table
where col1 = to_char(1234)
当col1看起来不像数字时,to_number会返回错误,停止查询。
答案 2 :(得分:4)
Oracle说无效号码。这是为什么?为什么我在varchar2时无法传递数字?
Oracle执行从col1
字符类型到数字的隐式转换,因为您将其作为数字进行比较。
此外,您假设1234
是正在提取的唯一行。实际上,Oracle必须从表中获取所有行,然后根据where
子句过滤掉。现在col1
中的字符值在遇到1234
行&之前被提取。导致错误,因为该字符无法转换为数字。
This fiddle显示了该行为。由于abc
canot可以转换为数字,因此您会收到该错误消息
现在,如果表中的仅记录是包含数字字符的col1记录,您将看到statement will work fine