我有一个 Oracle 表和一个列 ( col1
) 具有类型varchar2(12 byte)
。它有一行,col1
值为1234
当我说
select * from table where col1 = 1234
甲骨文说无效号码。这是为什么?为什么我不能传递一个数字varchar2
?
编辑:所有的反应都很棒。谢谢你。但我无法理解为什么它不需要1234
when1234
是有效的 varchar2 数据类型。
问题是您希望 Oracle 会隐式地将 1234 转换为字符类型。相反,Oracle 隐式将该列转换为一个数字。列中存在非数字值,因此 Oracle 会抛出错误。Oracle 文档在解释如何解决隐式转换之前警告不要隐式转换。解释您所看到的行为的规则是:
在将字符值与数值进行比较时,Oracle 会将字符数据转换为数值。
哦,转换为 char 比转换为数字要好得多:
select *
from table
where col1 = to_char(1234)
当 col1 看起来不像数字时,to_number 返回错误,停止查询。
甲骨文说无效号码。这是为什么?为什么当它是 varchar2 时我不能传递一个数字?
Oracle 执行从字符类型到数字的隐式转换col1
,因为您将其作为数字进行比较。
此外,您假设这1234
是唯一被提取的行。实际上,Oracle 必须从表中获取所有行,然后根据where
子句过滤掉。现在有一个字符值在col1
遇到您的行之前被提取,这会1234
导致错误,因为该字符无法转换为数字。
这个小提琴显示了这种行为。由于abc
无法转换为数字,因此您会收到该错误消息
现在,如果表中唯一的记录是 col1 包含数字字符的记录,您会看到该语句可以正常工作