以下声明与某些行的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