我在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()
我怎样才能做到这一点?
答案 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()) )
)