Where子句中的Oracle Case省略了Else表达式,结果如何?

时间:2018-02-09 10:58:14

标签: oracle null case where

以下声明与某些行的table2.level = 3何时相同?

SELECT *
  FROM table1, table2
 WHERE table1.value1 =
       CASE table2.id
           WHEN 1 THEN table2.value1(+)
           WHEN 2 THEN table2.value2(+)
       END

Oracle DOCS声明“CASE返回NULL”,如果没有一个案例评估为TRUE并且省略ELSE表达式,而是用{{CASE表达式替换NULL表达式1}}会产生0结果。

顺便说一下,结果是查询结果省略了table2.level = 3行的可选table2结果,好像AND之后的整个等式导致TRUE(对于那些特定的行)。

有人可以详细说明其工作方式/原因吗?

修改:使用(+)语法替换LEFT OUTER JOIN运算符有助于我深入了解CASE表达式返回NULL时的含义

如果table2.id IN (1,2,3)

,以下陈述相同
SELECT *
  FROM table1
       LEFT OUTER JOIN table2
           ON table1.value1 =
              CASE table2.id
                  WHEN 1 THEN table2.value1
                  WHEN 2 THEN table2.value2
              END
SELECT *
  FROM table1
       LEFT OUTER JOIN table2
           ON table1.value1 =
              CASE table2.id
                  WHEN 1 THEN table2.value1
                  WHEN 2 THEN table2.value2
                  WHEN 3 THEN NULL
              END
SELECT *
  FROM table1
       LEFT OUTER JOIN table2
           ON table1.value1 =
              CASE table2.id
                  WHEN 1 THEN table2.value1
                  WHEN 2 THEN table2.value2
                  ELSE NULL
              END

我认为这回答了这个问题; 它确实等同于NULL但仅适用于不在CASE表达式中的行,在table2.id = 1 OR table2.id = 2

时仍然可以外部加入table2结果

0 个答案:

没有答案