在 T-SQL 中,CASE
是一个从其中一个分支返回单个值的表达式。它不是语句,不能像在其他语言中那样用于控制流。你不能把整个条件放在里面。语义差异可能看起来很小,但行为差异是显着的。
在这种情况下使用CASE
表达式(没有双关语)不会很有价值,因为它需要多个分支,例如(我只是在这里猜测,因为您当前的查询并不清楚您正在尝试做什么):
WHERE a.checkdate IN
(DATEADD(DAY, 0-CASE DATEPART(WEEKDAY, [DATE])
WHEN 2 THEN 3 ELSE 1 END, [DATE]),
(DATEADD(DAY, 0-CASE DATEPART(WEEKDAY, [DATE])
WHEN 2 THEN 10 ELSE 8 END, [DATE]);
当然,CASE
在不无缘无故引入表达式的情况下将它们组合起来要容易得多:
WHERE
(
DATEPART(WEEKDAY, [DATE]) = 2
AND a.checkdate IN (DATEADD(DAY, -3, [DATE]), DATEADD(DAY, -10, [DATE]))
)
OR
(
DATEPART(WEEKDAY, [DATE]) <> 2
AND a.checkdate IN (DATEADD(DAY, -1, [DATE]), DATEADD(DAY, -8, [DATE]))
);
更容易的是预先定义两个变量(尽管我不确定 teradata 如何处理批次):
DECLARE @d1 DATE, @d2 DATE;
SET @d1 = DATEADD(DAY, -1, [DATE]);
SET @d2 = DATEADD(DAY, -8, [DATE]);
IF DATEPART(WEEKDAY, [DATE]) = 2
BEGIN
SELECT @d1 = DATEADD(DAY, 2, @d1), @d2 = DATEADD(DAY, 2, @d2);
END
SELECT ...
WHERE a.checkdate IN (@d1, @d2);