T-SQL CASE WHEN 语句不适用于 between
T-SQL CASE WHEN statement not working with between
所以我卡在了我的 where 声明中。每个单独的案例在 where 子句中都运行良好,但是当我尝试将它包装在一个 case when 语句中时,它打破了我。在 case when 语句中使用 between 语句有问题吗?下面是代码。如果有任何想法,请分享!
英文的逻辑是ssrs表单上有一个复选框。所以 box 可以是 1 或 0 并且取决于我将执行 where 语句的值。
WHERE (CASE @box
WHEN 1 THEN (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL)
ELSE 0 THEN (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL
AND NOT CheckReg.CheckDate IS NULL AND CheckReg.CheckDate IS NOT NULL)
END)
此外,如果有人知道比我上面的逻辑更好的解决方案,请告诉我。我正在使用 Microsoft sql 服务器
您需要使用OR
WHERE
(@box = 1 AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL))
OR
(@box = 0 AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL
AND NOT CheckReg.CheckDate IS NULL AND CheckReg.CheckDate IS NOT NULL))
或者您可以在 WHEN
部分组合条件并与 THEN
进行比较:
WHERE
(CASE
WHEN @box = 1 AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL)
THEN 1
WHEN @box = 0 AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL
AND NOT CheckReg.CheckDate IS NULL AND CheckReg.CheckDate IS NOT NULL)
THEN 1
ELSE 0
END
) = 1
您不能那样使用 CASE
- CASE
用于条件赋值,而不用于条件逻辑。您需要将每个逻辑流程分开:
WHERE
(
@box = 1
AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL)
)
OR
(
@box = 0
AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL )
AND NOT (CheckReg.CheckDate IS NULL AND CheckReg.CheckDate IS NOT NULL)
)
所以我卡在了我的 where 声明中。每个单独的案例在 where 子句中都运行良好,但是当我尝试将它包装在一个 case when 语句中时,它打破了我。在 case when 语句中使用 between 语句有问题吗?下面是代码。如果有任何想法,请分享!
英文的逻辑是ssrs表单上有一个复选框。所以 box 可以是 1 或 0 并且取决于我将执行 where 语句的值。
WHERE (CASE @box
WHEN 1 THEN (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL)
ELSE 0 THEN (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL
AND NOT CheckReg.CheckDate IS NULL AND CheckReg.CheckDate IS NOT NULL)
END)
此外,如果有人知道比我上面的逻辑更好的解决方案,请告诉我。我正在使用 Microsoft sql 服务器
您需要使用OR
WHERE
(@box = 1 AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL))
OR
(@box = 0 AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL
AND NOT CheckReg.CheckDate IS NULL AND CheckReg.CheckDate IS NOT NULL))
或者您可以在 WHEN
部分组合条件并与 THEN
进行比较:
WHERE
(CASE
WHEN @box = 1 AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL)
THEN 1
WHEN @box = 0 AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL
AND NOT CheckReg.CheckDate IS NULL AND CheckReg.CheckDate IS NOT NULL)
THEN 1
ELSE 0
END
) = 1
您不能那样使用 CASE
- CASE
用于条件赋值,而不用于条件逻辑。您需要将每个逻辑流程分开:
WHERE
(
@box = 1
AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL)
)
OR
(
@box = 0
AND (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkEndDate OR CheckReg.CheckDate IS NULL )
AND NOT (CheckReg.CheckDate IS NULL AND CheckReg.CheckDate IS NOT NULL)
)