我想做类似以下的事情,但我找不到实现这一目标的好方法。以下内容:
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
的好处。是不是可以这样做?
答案 0 :(得分:4)
您无法在CASE
内使用IN
。 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
);