2013-04-08 3 views
10
(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?Использование tsql больше, чем знак в выражении CASE

+0

В каких случаях действует ваша текущая учетная запись 'ELSE'? –

+0

@Damien_The_Unbeliever: когда DateEngaged равен NULL – StackTrace

ответ

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

вы можете использовать любое логическое выражение в статье КОГДА

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.

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.

1

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

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

Смежные вопросы