(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)
Assuming (from your comment) that when DateEngaged is NULL, it causes YearsInService to be NULL, then I'd remove your current ELSE clause, and then use that for all other cases, something like:
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
If there's a concern about future-dated DateEngaged values, I'd deal with that inside of YearsInService rather than try to deal with it in the CASE expression.
You are using a Simple Case statement where logical expressions are not allowed. You need to use a Searched CASE expression. But in your case since you are using a function it will be bit costly to get the return value from the function for each expression.
Here is MSDN Link for both Simple Case and Searched CASE Syntax
I would suggest you to use a sub query with a Searched case as bellow.
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
from 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
you can use any boolean expression in the WHEN clause
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
you should save [dbo].[YearsInService]([DateEngaged],getdate()) in a variable before evaulation tho.
You can't, the CASE YourFunction WHEN ... is for equalities only. If you need to use "greater than", you'll need to rewrite your expression this way:
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
I like @kaf 's answer, just want add that you may reduce the number of case by this
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
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
This equates all the cases above 10 to the value of the function.