Sql 我可以在Oracle中传递varchar2的号码吗?

Sql 我可以在Oracle中传递varchar2的号码吗?,sql,oracle,ora-01722,Sql,Oracle,Ora 01722,我有一个Oracle表和一列(col1)的类型为varchar2(12字节)。它有一行,值col1为1234 当我说 select * from table where col1 = 1234 甲骨文说这个数字无效。为什么呢?为什么当一个数字是varchar2时我不能传递它 编辑:所有的回答都很好。非常感谢。但我无法理解为什么当1234是有效的varchar2数据类型时,不需要1234。哦,转换为字符比转换为数字要好得多: select * from table where col1 = to

我有一个Oracle表和一列(
col1
)的类型为
varchar2(12字节)
。它有一行,值
col1
1234

当我说

select * from table where col1 = 1234
甲骨文说这个数字无效。为什么呢?为什么当一个数字是
varchar2
时我不能传递它


编辑:所有的回答都很好。非常感谢。但我无法理解为什么当
1234
是有效的varchar2数据类型时,不需要
1234

哦,转换为字符比转换为数字要好得多:

select *
from table
where col1 = to_char(1234)

当col1看起来不像一个数字时,to_number返回一个错误,停止查询。

问题在于,您希望Oracle将1234隐式转换为字符类型。相反,Oracle隐式地将列转换为数字。列中有一个非数值,因此Oracle会抛出一个错误。在解释如何解决隐式强制转换之前,警告不要使用隐式强制转换。解释你所看到的行为的规则是:

在比较字符值和数值时,Oracle会将字符数据转换为数值

甲骨文说这个数字无效。为什么呢?为什么我不能传递一个varchar2的数字

Oracle将字符类型从
col1
隐式转换为数字,因为您将其作为数字进行比较

此外,您还假设
1234
是正在提取的唯一一行。实际上,Oracle必须从表中获取所有行,然后根据
where
子句进行筛选。现在在
col1
中有一个字符值,它在遇到
1234
行之前被提取&这导致了错误,因为该字符无法转换为数字

表现出这种行为。由于
abc
无法转换为数字,因此会收到该错误消息



现在,如果表中唯一的记录是包含数字字符的col1记录,您将看到

谢谢。所以字符是1234,oracle隐式地将其转换为数字。既然1234是一个有效的数字,为什么会出现这个错误呢?表中有些东西不是数字。甲骨文留下1234作为一个数字。它正在尝试转换列中的值以匹配。当它发现一个不是数字的值时,就会抛出错误。谢谢。很好的解释