Sql server 使用tsql大于符号大小写表达式

Sql server 使用tsql大于符号大小写表达式,sql-server,tsql,case,Sql Server,Tsql,Case,现在在我的最后一行中,我怎么能说10及以上应该作为150返回呢?您使用的是一个简单的Case语句,其中不允许使用逻辑表达式。您需要使用搜索的大小写表达式。但在您的情况下,由于您使用的是函数,因此从函数中获取每个表达式的返回值的成本会有点高 我建议您使用子查询并搜索案例,如下所示 (case [dbo].[YearsInService]([DateEngaged],getdate()) when (0) then (0) when (1) then (4) when (2)

现在在我的最后一行中,我怎么能说10及以上应该作为150返回呢?

您使用的是一个
简单的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)

不能,当…
时,
情况下的函数仅用于等式。如果需要使用“大于”,则需要按以下方式重写表达式:

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

在计算之前,您应该将[dbo].[YearsInService]([DateEngaged],getdate())保存在一个变量中。

假设(根据您的注释)当
DateEngaged
NULL
时,它会导致
YearsInService
NULL
,然后我会删除当前的
ELSE
子句,然后将其用于所有其他情况,例如:

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

如果有人担心未来日期的
DateEngaged
值,我会在
YearsInService
内处理,而不是尝试在
案例中处理它。

我喜欢@kaf的答案,只是想补充一点,你可以通过这个来减少案例数量

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

这将10以上的所有情况等同于函数的值。

您当前的
ELSE
子句解释了哪些情况?@Damien\u异信者:DateEngaged为空时
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
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
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