5

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

当我说

select * from table where col1 = 1234

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

编辑:所有的反应都很棒。谢谢你。但我无法理解为什么它不需要1234when1234是有效的 varchar2 数据类型。

4

3 回答 3

5

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

在将字符值与数值进行比较时,Oracle 会将字符数据转换为数值。

于 2012-05-02T22:10:09.333 回答
4

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

select *
from table
where col1 = to_char(1234)

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

于 2012-05-02T19:39:22.697 回答
4

甲骨文说无效号码。这是为什么?为什么当它是 varchar2 时我不能传递一个数字?

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

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

这个小提琴显示了这种行为。由于abc无法转换为数字,因此您会收到该错误消息


现在,如果表中唯一的记录是 col1 包含数字字符的记录,您会看到该语句可以正常工作

于 2012-05-03T05:19:19.200 回答