我最近遇到了一个代码,其中假设在case statement
的最后加入,我无法理解。谁能告诉我使用这种方法/代码的目的。
代码:
FULL OUTER JOIN #std b ON a.empid = b.mgrid
AND CASE
WHEN a.empname IS NOT NULL
THEN a.empname
ELSE a.mgrname
END = b.stdname
我不理解的是END = b.std
。我想知道它的目的。感谢。
答案 0 :(得分:3)
case
是一个表达式,它返回一个值 - 在这种情况下,a.empname
或a.mgrname
(虽然在这种情况下,它很愚蠢 - 你应该使用{ {1}}而不是)。然后将返回的值与coalesce(a.empname, a.mgrname)
进行比较。
那就是说,无论如何,加入有点怀疑。您可能想要考虑一下您正在尝试做什么。
答案 1 :(得分:1)
WHERE
子句的第二个谓词相当于:
COALESCE(a.empname, a.mgrname) = b.stdname
即。 a.empname
用于与b.stdname
,进行比较,除非 a.empname
为空。在后一种情况下,使用a.mgrname
代替。
答案 2 :(得分:1)
这与:
相同FULL OUTER JOIN #std b ON a.empid = b.mgrid
AND (CASE
WHEN a.empname IS NOT NULL
THEN a.empname
ELSE a.mgrname
END) = b.stdname
答案 3 :(得分:0)
您所看到的END = b.stdname
本身并不是表达。 END
是CASE
expression的终止部分。
CASE
表达式计算条件列表并返回多个可能的结果表达式之一。您可以在链接中查找语法,您会看到它始终以单词END
结尾。
您发布的示例中的表达式:
CASE
WHEN a.empname IS NOT NULL
THEN a.empname
ELSE a.mgrname
END
根据条件a.empname IS NOT NULL
返回一个结果。如果此条件为真,则返回a.empname
否则它将返回a.mgrname
。然后将此结果作为b.stdname
条件的一部分与JOIN
进行比较。