Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL语句不使用中间语句时的情况_Sql_Sql Server_Reporting Services_Case - Fatal编程技术网

T-SQL语句不使用中间语句时的情况

T-SQL语句不使用中间语句时的情况,sql,sql-server,reporting-services,case,Sql,Sql Server,Reporting Services,Case,所以我被困在我的where声明中。在where子句中,每个单独的案例都运行良好,但当我尝试将其封装在case where语句中时,它会打断我的话。在case when语句中使用between语句是否有问题?下面是代码。如果有任何想法,请分享 英语中的逻辑是ssrs表单上有一个复选框。所以box可以是1或0,根据值,我将执行where语句 WHERE (CASE @box WHEN 1 THEN (CheckReg.CheckDate BETWEEN @ChkStartDate and @ChkE

所以我被困在我的where声明中。在where子句中,每个单独的案例都运行良好,但当我尝试将其封装在case where语句中时,它会打断我的话。在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 Server

您需要使用

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 
   (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)
)

之后
应该有一个表达式返回一些值,而不是另一个逻辑比较
和not CheckReg.CheckDate为NULL和CheckReg.CheckDate不为NULL
应该做什么?AND not部分实际上是工作的,这是我制作异或的方式。获取所有空值或范围内的所有日期。此答案也是正确的,谢谢。我相信我只能核对一个答案,所以我选择了第一个答案。我真的很感谢你的帮助-彼得