繁体   English   中英

使用IN而不是=的CASE

[英]Using CASE with IN rather than =

我想做以下事情,但是我找不到实现它的好方法。 下列:

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的好处。 这是不可能的吗?

您不能在IN内使用CASE CASE是一个返回最多单个值的表达式 它不能像其他语言中的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
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM