我有一个连接两个表的查询。一个表的列类型为 varchar,另一表的列类型为 number。我已经在 3 个 Oracle 数据库上执行了查询,并且看到了一些奇怪的结果,希望能够得到解释。在其中两个数据库上,类似以下内容的工作。
select a.col1, b.somecol
from tableA a inner join tableB b on b.col2=a.col1;
在此查询中,tableA.col1 的类型为 number,tableB.col2 的类型为 varchar。这在两个数据库中运行良好,但在第三个数据库中则不然。在第三个中我收到(ORA-01722)错误。在第三个我需要做类似的事情......
select a.col1, b.somecol
from tableA a inner join tableB b on b.col2=to_char(a.col1);
这适用于所有数据库。我的问题是为什么?上面是一个简化的查询,真正的查询稍微复杂一点,检索大量数据,因此第一个版本要快得多。如果我能让它在所有环境中工作那就太好了。
有谁知道为什么这可以在某些 oracle 数据库中工作,而在其他没有数据类型转换的情况下不起作用?是否存在允许这种行为的全局设置?
隐式转换失败的原因之一是连接 varchar 列包含非数字数据。 Oracle 通过转换字符串来处理 number 到 varchar2 连接(查看 Gary 在评论中的引用),因此它实际上执行以下操作:
select a.col1, b.somecol
from tableA a inner join tableB b on to_number(b.col2)=a.col1;
如果 tableB.col2 包含非数字值 - 看起来很可能,它毕竟是一个字符串 - 那么它会抛出ORA-01722: invalid number
。通过显式地将数字列转换为字符串,可以缩短 Oracle 的默认行为。
事实上,您在前两个环境中没有遇到此问题是运气问题,而不是配置问题。它可能随时发生攻击,因为它只需要一个非数字字符串即可破坏查询。所以实际上你应该在所有环境中运行显式转换。
至于性能,您可以构建一个基于函数的索引......
create index whatever_idx on tableA ( to_char(col1) )
/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)