(case [dbo].[YearsInService]([DateEngaged],getdate())
when (0) then (0)
when (1) then (4)
when (2) then (8)
when (3) then (12)
when (4) then (32)
when (5) then (40)
when (6) then (48)
when (7) then (56)
when (8) then (104)
when (9) then (117)
when (10) then (150) else (-1) end)
现在在我的最后一行,我怎么能说10和以上应该返回150?
答案 0 :(得分:11)
你不能,CASE YourFunction WHEN ...
仅用于平等。如果你需要使用“大于”,你需要以这种方式重写你的表达式:
CASE WHEN [dbo].[YearsInService]([DateEngaged],getdate()) = 0 THEN 0
WHEN [dbo].[YearsInService]([DateEngaged],getdate()) = 1 THEN 4
WHEN.....
WHEN [dbo].[YearsInService]([DateEngaged],getdate()) >= 10 THEN 150 ELSE -1 END
答案 1 :(得分:8)
您正在使用Simple Case statement
,其中不允许使用逻辑表达式。您需要使用Searched CASE expression
。但是在你的情况下,因为你正在使用一个函数,从函数中获取每个表达式的返回值会有点代价。
Here is MSDN Link for both Simple Case and Searched CASE Syntax
我建议您使用sub query with a Searched case
,如下所示。
select case when results = 0 then 0
when results = 1 then 4
...
when results >= 10 then 150
else -1 end as CaseResults
from (select [dbo].[YearsInService]([DateEngaged],getdate()) results
from yourTable
) Temp
答案 2 :(得分:1)
来自http://msdn.microsoft.com/en-us/library/ms181765.aspx
SELECT
CASE
WHEN MIN(value) <= 0 THEN 0
WHEN MAX(1/value) >= 100 THEN 1
END
FROM Data
您可以在WHEN子句中使用任何布尔表达式
case
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 0) then (0)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 1) then (4)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 2) then (8)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 3) then (12)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 4) then (32)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 5) then (40)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 6) then (48)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 7) then (56)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 8) then (104)
when ([dbo].[YearsInService]([DateEngaged],getdate()) = 9) then (117)
when ([dbo].[YearsInService]([DateEngaged],getdate()) >= 10) then (150)
else (-1) end
你应该在evaulation tho之前的变量中保存[dbo]。[YearsInService]([DateEngaged],getdate())。
答案 3 :(得分:1)
假设(根据您的评论),当DateEngaged
为NULL
时,会导致YearsInService
为NULL
,然后我会移除您当前的ELSE
子句,然后将其用于all other cases
,例如:
case COALESCE([dbo].[YearsInService]([DateEngaged],getdate()),-1)
when (-1) then (-1)
when (0) then (0)
when (1) then (4)
when (2) then (8)
when (3) then (12)
when (4) then (32)
when (5) then (40)
when (6) then (48)
when (7) then (56)
when (8) then (104)
when (9) then (117)
else (150) end
如果对未来日期DateEngaged
值存在疑虑,我会在YearsInService
内处理,而不是尝试在CASE
表达式中处理它。
答案 4 :(得分:1)
我喜欢@kaf的答案,只想添加一下你可以通过这个减少案例数量
select case when results BETWEEN 0 AND 3 then results * 4
when results BETWEEN 4 AND 7 then results * 8
when results BETWEEN 8 AND 9 then results * 13
when results >= 10 then 150
else -1
end as CaseResults
from (select [dbo].[YearsInService]([DateEngaged],getdate()) results
from yourTable
) Temp
答案 5 :(得分:0)
case [dbo].[YearsInService]([DateEngaged],getdate())
when (0) then (0)
when (1) then (4)
when (2) then (8)
when (3) then (12)
when (4) then (32)
when (5) then (40)
when (6) then (48)
when (7) then (56)
when (8) then (104)
when (9) then (117)
when IIF(case [dbo].[YearsInService]([DateEngaged],getdate()) >= 10
,[dbo].[YearsInService]([DateEngaged],getdate())
,10)
then (150)
else (-1) end
这将所有大于10的情况等同于函数的值。