【问题标题】:Match exact values on oracle join在 oracle join 上匹配精确值
【发布时间】:2013-04-12 11:07:22
【问题描述】:

来了。
我有两张表,分别是 Application 和 Report。
这些表有一个公共列(分别为 appId、externalAppId),可以将它们连接起来以查找唯一值。
我的问题是,当我加入这 2 个表时,我得到了我并不真正想要的值。

示例值

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。
我也无法更改。有什么解决方法吗?
我见过可以删除前导零然后匹配的正则表达式,但只是想知道是否有更好的解决方案。
即我可以指定连接仅适用于值完全匹配?

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

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

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

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

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

    to_char(application.appId) = report.externalAppId
    

    【讨论】:

    • 正是我想要的。我知道加入有问题。非常感谢!
    • 但我仍然想知道为什么 Oracle 让用户这样做,而不是像所有其他编程语言一样在运行查询时抛出语法错误或其他东西。
    • @jijo 您必须了解列的数据类型。没有什么比数据库中的数据更重要了 :) 它也可能是 ANSI 建议,因为 Mysql behaves like thatSQLLiteSQL Server 也是。只有PostgreSQL 会引发错误。
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2022-07-01
    • 2013-08-15
    • 2012-07-22
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多