在Oracle上选择字符串作为数字

fre*_*tix 9 sql oracle oracle10g

我发现这种奇怪的行为,我正在用这个打破我的大脑......任何人都有任何想法?

Oracle 10g:我有两个不同的表,都有一个名为" TESTCOL "的列为Varchar2 (10),不可为空.

如果我在table1上执行此查询,我会得到正确的结果:

select * from table1 where TESTCOL = 1234;
Run Code Online (Sandbox Code Playgroud)

请注意,我特别没有放置'1234'...这不是一个错字,这是一个动态生成的查询,我会尽量不改变它(至少在不久的将来不会).

但是,如果我在table2上运行相同的查询,我收到此错误消息:

ORA-01722: Invalid number
Run Code Online (Sandbox Code Playgroud)

两个查询都在同一个会话,同一个数据库上运行.

我已经通过该列加入了这两个表,并且连接工作正常,唯一的问题是每当我尝试使用该条件时都会显示.

关于从一张桌子到另一张桌子有什么不同的任何想法?

提前致谢.

Luk*_*der 25

如果TESTCOL包含非数字,则在将TESTCOL条目转换为数字时,Oracle可能会遇到问题.因为,它内部的作用是:

select * from table1 where TO_NUMBER(TESTCOL) = 1234;
Run Code Online (Sandbox Code Playgroud)

如果您确定1234不能表示为VARCHAR文字,那么请尝试这样做,以便比较varchar值,而不是数字值:

select * from table1 where TESTCOL = TO_CHAR(1234);
Run Code Online (Sandbox Code Playgroud)


APC*_*APC 5

很明显,TABLE2.TESTCOL包含的值不是数字.将字符串与数字文字进行比较会生成隐式转换.因此TESTCOL中的任何值都不能被强制转换为数字将会抛出ORA-1722.

在比较两个表时,它不会打击你,因为你正在比较字符串.

所以你有几个选择,其中你会喜欢.最明显的答案是清理数据,因此TABLE2不包含非数字.理想情况下,您应该将此与将列更改为数字数据类型相结合.否则,您可以更改生成器,以便生成可以针对shonky数据模型运行的代码.在这种情况下,如果映射列具有字符数据类型,则表示将文字包装在引号中.