在SQL中的CASE语句中澄清

时间:2015-04-29 11:43:36

标签: sql sql-server

我最近遇到了一个代码,其中假设在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。我想知道它的目的。感谢。

4 个答案:

答案 0 :(得分:3)

case是一个表达式,它返回一个值 - 在这种情况下,a.empnamea.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本身并不是表达。 ENDCASE 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进行比较。