在这里
我有两张表,申请和报告
表中有一个公共列(分别为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。
我也不能改变它。有没有解决方法?
我看过正则表达式可以删除前导零然后匹配,但只是想知道是否有更好的解决方案。
即我可以指定连接只适用于具有完全匹配的值?
答案 0 :(得分:4)
Oracle只能比较相同数据类型的两个值。我不能强调这一点。事实上,大多数语言只有在相同的数据类型时才能比较两个值。数学中的关系也将使用相同类型的对象定义(以便您可以定义transitivity,reflexivity ...)。还有橙子和苹果的说法:不要试图比较它们。
因此,当您要求Oracle比较不同数据类型的两个值时,将发生隐式转换。在大多数情况下,你应该避免这些转换,因为将选择哪种数据类型的规则可能非常复杂,并且(就像在这种情况下)会经常产生错误,因为你会错误地猜出 win将会是哪种类型。您应该依赖显式转换(您指定的转化)。
我认为Application (appId)
是NUMBER
而Report (ExternalAppId)
属于VARCHAR2
。在这种情况下,Oracle选择将ExternalAppId
转换为NUMBER
,并在NUMBER
空间转换00123=123
,因为数字没有格式。
您应该将您的加入条件改为:
to_char(application.appId) = report.externalAppId