匹配oracle join上的确切值

时间:2013-04-12 11:07:22

标签: sql oracle join

在这里 我有两张表,申请和报告 表中有一个公共列(分别为appId,externalAppId),可以将它们连接起来查找唯一值 我的问题是,当我加入这两张桌子时,我得到了我真正不想要的价值
样本值

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

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

1 个答案:

答案 0 :(得分:4)

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

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

我认为Application (appId)NUMBERReport (ExternalAppId)属于VARCHAR2。在这种情况下,Oracle选择将ExternalAppId转换为NUMBER,并在NUMBER空间转换00123=123,因为数字没有格式

您应该将您的加入条件改为:

to_char(application.appId) = report.externalAppId