尝试嵌套CASE WHEN THEN语句时出现“条件预期”错误

时间:2015-03-19 10:41:05

标签: sql-server tsql case

我的更改之前的代码(工作得非常好):

CASE WHEN b.EPIdentifier IS NOT NULL THEN b.EndTime

我尝试实现一些进一步的嵌套时的更改,然后是逻辑:

CASE WHEN b.EPIdentifier IS NOT NULL THEN 
    CASE WHEN b.CancelEndTime IS NOT NULL THEN
        b.CancelEndTime
    ELSE CASE WHEN b.ExtendedEndDate IS NOT NULL THEN
        b.ExtendedEndDate
    ELSE CASE WHEN b.EndTime IS NOT NULL THEN
        b.EndTime
ELSE a.EndDate END EndDate

我在最后EndDate收到错误:

  

在期望条件的上下文中指定的非布尔类型的表达式

我无法弄清楚为什么我会收到错误。我试图改为AS EndDate,但我仍然得到同样的错误。我是否因为筑巢而弄乱了什么?我无法发现任何事情。

2 个答案:

答案 0 :(得分:2)

您必须在每个END上加CASE WHEN。你的表达应该是这样的:

CASE WHEN b.EPIdentifier IS NOT NULL THEN 
    CASE WHEN b.CancelEndTime IS NOT NULL THEN b.CancelEndTime
    ELSE CASE WHEN b.ExtendedEndDate IS NOT NULL THEN b.ExtendedEndDate
         ELSE CASE WHEN b.EndTime IS NOT NULL THEN b.EndTime END
         END
    END
ELSE a.EndDate END EndDate

无论如何,您可以使用COALESCE简化表达:

CASE WHEN b.EPIdentifier IS NOT NULL THEN COALESCE(b.CancelEndTime, b.ExtendedEndDate, b.EndTime)
ELSE a.EndDate END EndDate

来自 MSDN

  

COALESCE表达式是CASE表达式的语法快捷方式。也就是说,代码COALESCE(expression1,... n)被查询优化器重写为以下CASE表达式:

CASE

   WHEN (expression1 IS NOT NULL) THEN expression1
   WHEN (expression2 IS NOT NULL) THEN expression2
   ...
   ELSE expressionN
END 

答案 1 :(得分:0)

  

END是CASE语句的一部分,因此您必须查找END。

SYNTAX FOR CASE声明: SQL CASE

Simple CASE expression: 
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 
Searched CASE expression:
CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END