使用带有IN的CASE而不是=

时间:2013-12-09 16:06:36

标签: sql sql-server sql-server-2008

我想做类似以下的事情,但我找不到实现这一目标的好方法。以下内容:

where i.expirationdate in 
    case when i.locationstate = 'ca' then 
        case when datepart(month, @RunDate) < 3 then 
               (dateadd(day, 60, @RunDate))
             when datepart(month, @RunDate) = 3 then 
               (dateadd(day, 60, @RunDate), dateadd(day, 90, @RunDate))
             else 
               (dateadd(day, 90, @RunDate))
        end
    else 
           (dateadd(day, 45, @RunDate))
    end

抛出错误:

  

关键字'case'附近的语法不正确

它适用于=,但显然我失去了in的好处。是不是可以这样做?

1 个答案:

答案 0 :(得分:4)

您无法在CASE内使用INCASE是一个表达式,它返回单个值;它不能用于控制流程,如CASE 语句可以在其他语言中使用,或者用于返回多个值(如IN那样)。

我会这样重写:

DECLARE @m TINYINT = DATEPART(MONTH, @RunDate),
        @d45 DATETIME = DATEADD(DAY, 45, @RunDate),
        @d60 DATETIME = DATEADD(DAY, 60, @RunDate),
        @d90 DATETIME = DATEADD(DAY, 90, @RunDate);

SELECT
  ...
WHERE 
(
  i.locationstate = 'ca' AND
  (
       ( @m < 3 and i.expirationdate = @d60 )
    OR ( @m = 3 and i.expirationdate IN (@d60, @d90) )
    OR ( @m > 3 AND i.expirationdate = @d90 )
  )
)
OR
(
  i.locationstate <> 'ca' AND i.expirationdate = @d45
);