比较来自世界各地的卖家的域名和 IT 服务价格

选择一个字符串作为数字 Oracle

我发现这个奇怪的行为并突破了它...有没有人有任何想法?

Oracle 10g:
我有两个不同的表格 , 都有这个列命名 "

TESTCOL

" 作为

Varchar2/10/

, 没有重置。

如果我履行这个请求

桌子

1 , 我会得到正确的结果:


select * from table1 where TESTCOL = 1234;


笔记

注意我没有特别放置 '1234'... 这不是拼写错误,它是一个动态生成的查询,我会尽量不要改变它。 /至少在不久的将来/.

但如果我履行相同的请求

桌子

2, 我将收到以下错误消息:


ORA-01722: Invalid number


两个请求都在一个会话中执行,在一个数据库中。

我根据这一列连接这两个表,连接工作正常,只要我尝试使用此条件,唯一的问题就会表现出来。

关于什么可以与一张桌子不同的想法?

提前致谢。
已邀请:

奔跑吧少年

赞同来自:

如果一个
TESTCOL

那时不包含数字 Oracle 转换记录时可能会遇到问题
TESTCOL

数量。 因为他在内部做了什么,是:


select * from table1 where TO_NUMBER/TESTCOL/ = 1234;


如果你真实的话
1234

不能表达为文字
VARCHAR

, 然后尝试相反比较 varchar, 而不是数字:


select * from table1 where TESTCOL = TO_CHAR/1234/;

龙天

赞同来自:

这很明显 TABLE2.TESTCOL 包含值

不是数字

. 使用数字文字的字符串的比较导致隐式转换。 因此,任何价值 TESTCOL, 哪个不能给予数字会抛出 ORA-1722.

它在比较两个表时不会影响你,因为你比较字符串。

所以,你有几个选项,其中没有一个你不喜欢。 最明显的答案清除表到表格 2 hdoes 没有包含非数字数字。 理想情况下,您必须将其与数字数据类型的列更改相结合。 否则,您可以更改生成器,以便它产生您可以针对数据模型运行的代码 shonky. 在这种情况下,如果相关的列具有字符类型的数据,则这意味着在引号中包装文字。

八刀丁二

赞同来自:

在这里,您遇到了隐式豆腐的危险。

用表达方式
testcol = 1234

你宣布你想考虑
testcol

作为数字栏,所以 Oracle 尝试在此列中转换所有值。

ORA-01722 它出现,因为显然,在该列中至少有一个值

不是

是一个数字。

即使你声称它 "

不是错字

", 这是真实的。 这是一个语法错误。

您需要将参数声明为使用单引号的字符串文字:
where testcol = '1234'


创建正确的州 - 这是您问题的唯一解决方案。

风见雨下

赞同来自:

必须工作以下内容。 只是替换 "your where".


select * 
from table1
where /select TO_NUMBER/TESTCOL/
from table2
where "your where"/ = 1234;

要回复问题请先登录注册