我在where子句中有一个案例,我需要根据@MyStatus
值更改使用的运算符。我做了一些像这样的事情,但它没有工作
......
WHERE
CASE @WorkStatus
WHEN 1
THEN X.EarlyEnd < GETDATE()
WHEN 2
THEN X.EarlyEnd = GETDATE()
WHEN 3
THEN X.EarlyEnd > GETDATE()
END)
答案 0 :(得分:2)
如果您根本不必使用CASE
语句,以下内容也可以使用:
...
WHERE(@WorkStatus = 1 AND [X].[EarlyEnd] < GETDATE())
OR (@WorkStatus = 2 AND [X].[EarlyEnd] = GETDATE())
OR (@WorkStatus = 3 AND [X].[EarlyEnd] > GETDATE());
答案 1 :(得分:1)
SQL Server有一个case expression而不是语句。差异是表达式返回一个值,而一个语句controls flow。
您的case表达式需要返回一个可以测试的值。例如:
...
WHERE
CASE
WHEN @WorkStatus = 1 AND X.EarlyEnd < GETDATE() THEN 1
WHEN @WorkStatus = 2 AND X.EarlyEnd = GETDATE() THEN 1
WHEN @WorkStatus = 3 AND X.EarlyEnd > GETDATE() THEN 1
ELSE 0
END = 1 -- Test value returned by expresssion.
...
修改:@OnkelToob's answer在这种情况下更好。他正确地发现你根本不需要案件表达。