在WHERE子句的AND部分中使用CASE或IF..ELSE - SQL Server

时间:2017-11-14 13:03:41

标签: sql sql-server stored-procedures case

我在SQL Server中有一个存储过程。 此SP的SELECT部分​​如下:

SELECT * FROM demoTable dt
INNER JOIN demoTable2 dt2
WHERE
      (@StartDate IS NULL OR dt.StartDate = @StartDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate))   
      AND (@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate))    

现在我想在AND条件之后修改上面的WHERE子句部分。 我添加了3个传递给此SP的新参数/变量。

@ID int , @isAdmin int and @Date varchar(50)

使用这些变量的值我试图操纵上面的WHERE子句如下:

 WHERE
   @StartDate IS NULL OR dt.StartDate = @StartDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate))   
    -- Logic change below          
    AND(
    CASE WHEN (@ID != 100 AND @isAdmin != 1)
    THEN (@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate))    
    ELSE (dt.EndDate>sysdatetime()) 
    END)   

但是在这次修改之后我收到了错误。

错误陈述:

Incorrect syntax near the keyword 'IS'.

此错误指向我已修改逻辑部分使用IS NULL的行。

基本上我想要做的是为 AND 应用原始逻辑,即

(@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate))    

仅在

(@ID != 100 AND isAdmin != 1)

成立,否则我想应用新的逻辑,即

(dt.EndDate>sysdatetime()

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

如果您想要@ID !=100 AND isAdmin !=1

的特殊条件

你不需要case / when,你只需要一个有效的布尔表达式

改变:

AND(
    CASE WHEN (@ID != 100 AND isAdmin != 1)
    THEN (@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= 
@StartDate and dt.EndDate <= @EndDate))    
    ELSE (dt.EndDate>sysdatetime()) 
    END
)

AND(
    ((@ID != 100 AND isAdmin != 1) AND (@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate)))    
    OR
    ((@ID == 100 OR isAdmin == 1)  AND (dt.EndDate>sysdatetime()) )
)