Использование 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 к значению функции.