【问题标题】:Oracle try second condition only if first one gave nothing in joinOracle 仅在第一个条件没有给出任何连接时才尝试第二个条件
【发布时间】:2018-07-10 10:03:56
【问题描述】:

我正在 Oracle 中寻找一种方法来执行类似 如果第一个条件不匹配,则执行第二个条件。让我们举个例子。

我在查询中有这个 JOIN:

SELECT A.COL1, A.COL2, B.COL1, B.COL2 
FROM A
FULL JOIN (SELECT COL1, COL2 FROM B)
ON B.COL1 = A.COL1
       OR B.COL2 = A.COL2

你看,在这个 OR 条件下,我可以为同一个 B 对象创建两个连接。我不希望那样。我想要的是这样的:

  • 如果没有结果 B.COL1 = A.COL1
  • 然后让我们尝试使用 B.COL2 = A.COL2 进行连接

【问题讨论】:

  • ON (B.COL1 = A.COL1) OR (B.COL1 <> A.COL1 and B.COL2 = A.COL2)

标签: sql oracle join


【解决方案1】:

如果B.COL1 = A.COL1 则返回行。或者,如果B.COL1 <> A.COL1B.COL2 = A.COL2 也返回行。

SELECT A.COL1, A.COL2, B.COL1, B.COL2 
FROM A
FULL JOIN (SELECT COL1, COL2 FROM B) B
   ON (B.COL1 = A.COL1)
   OR (B.COL1 <> A.COL1 and B.COL2 = A.COL2) 

【讨论】:

    【解决方案2】:

    您需要在第二个过滤器中包含对条件 B.COL1 = A.COL1 的否定。天真地,这是 B.COL1 &lt;&gt; A.COL1 但这不处理 NULL 值,所以你需要像这样使用 B.COL1 &lt;&gt; A.COL1 OR B.COL1 IS NULL OR A.COL1 IS NULL

    SELECT A.COL1, A.COL2, B.COL1, B.COL2 
    FROM   A
           FULL JOIN (SELECT COL1, COL2 FROM B)
           ON (  B.COL1 = A.COL1
              OR ( ( B.COL1 <> A.COL1 OR B.COL1 IS NULL OR A.COL1 IS NULL )
                   AND B.COL2 = A.COL2
                 )
              )
    

    【讨论】:

    • 好主意,我假设 会处理 NULL 值
    • 布尔表达式可以有三个值 - TRUEFALSENULL(未知值)。 Value = NULL 输出 NULLValue &lt;&gt; NULL 输出 NULL 在这两种情况下都不是 TRUE 所以过滤器将永远不会匹配这些行,您需要特别处理 NULL 情况。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2023-02-03
    • 2018-09-14
    • 1970-01-01
    • 2021-11-26
    • 2021-01-28
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多