1

就这样吧。
我有两张表,应用程序和报告。
这些表有一个共同的列(分别为 appId、externalAppId),可以将其连接起来以查找唯一值。
我的问题是当我加入这两张表时,我得到了我并不真正想要的值。

样本值

Application   Report
No appId      ReportNo ExternalAppId
1  123         1        123
2  456         2        00000123
3  789         3        321

因此,当我在 where 条件中说 Application.appId = Report.ExternalAppId 时,它会从 Report table 返回我的 123 和 00000123 行。
连接中不考虑前导零。
我只需要完全匹配的结果。
在这种情况下,仅第一行。我认为问题的原因是appId是数字,而ExternalAppId是varchar。
这个我也改不了。有什么解决方法吗?
我见过可以删除前导零然后匹配的正则表达式,但只是想知道是否有更好的解决方案。
即我可以指定连接只适用于完全匹配的值吗?

4

1 回答 1

4

Oracle 只能比较相同数据类型的两个值。我怎么强调都不过分。事实上,大多数语言只有在数据类型相同时才能比较两个值。数学中的关系也将使用相同类型的对象定义(以便您可以定义传递性自反性......)。橙子和苹果也有这样的说法:不要试图比较它们。

因此,当您要求 Oracle 比较不同数据类型的两个值时,会发生隐式转换。在大多数情况下,您应该避免这些转换,因为选择哪种数据类型而不是其他数据类型的规则可能非常复杂,并且(就像在这种情况下)经常会产生错误,因为您会错误地猜测哪种类型会获胜。您应该依赖显式转换(您指定的转换)。

我假设那Application (appId)是 aNUMBER并且Report (ExternalAppId)是 type VARCHAR2。在这种情况下,Oracle 选择在空格中转换ExternalAppId为, ,因为数字没有格式NUMBERNUMBER00123=123

你应该把你的加入条件写成:

to_char(application.appId) = report.externalAppId
于 2013-04-12T11:14:53.537 回答