Использование tsql больше, чем знак в выражении CASE

(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?

Ответ 1

Вы не можете, 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

Ответ 2

Вы используете Simple Case statement, где логические выражения не допускаются. Вам нужно использовать Searched CASE expression. Но в вашем случае, поскольку вы используете функцию, это будет дорого стоить, чтобы получить возвращаемое значение из функции для каждого выражения.

Вот ссылка MSDN для простого синтаксиса CASE и Searched

Я предлагаю вам использовать 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

Ответ 3

из 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

вы должны сохранить [dbo]. [YearsInService] ([DateEngaged], getdate()) в переменной перед evaulation tho.

Ответ 4

Предполагая (из вашего комментария), что когда 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.

Ответ 5

Мне нравится @kaf answer, просто добавьте, что вы можете уменьшить количество случаев на этом

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

Ответ 6

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 к значению функции.