如果else转换为SQL Server中的and或,则为

问题描述

| 我正在转换此查询
WHERE (Worksheet.ProjectId = \' +  CONVERT(VARCHAR(10),@ProjectId) + \')

    IF(@StatusTypeId IS NULL)
    BEGIN
        SET @WhereClause = \' AND StatusType.StatusTypeId IS NULL\'
    END
    ELSE IF (@StatusTypeId > 0)
    BEGIN
        SET @WhereClause = \' AND StatusType.StatusTypeId = \' + CONVERT(VARCHAR(10),@StatusTypeId)
    END
有了这个
WHERE Worksheet.ProjectId = @ProjectId
AND
((@StatusTypeId IS NULL AND StatusType.StatusTypeId IS NULL)
OR (@StatusTypeId > 0 AND StatusType.StatusTypeId = @StatusTypeId))
这有什么问题。当我只给出@ProjectId时,它不显示任何行,但显示行记录,但当我同时给出两个参数值时,表示projectId和statusTypeId可以正常工作。 谢谢。     

解决方法

        此代码...
IF(@StatusTypeId IS NULL)
BEGIN
    SET @WhereClause = \' AND StatusType.StatusTypeId IS NULL\'
END
..具有隐式ELSE
ELSE --@StatusTypeId IS NOT NULL
    SET ... is something always true because no condition dynamically added
您错过了这个隐含的\“ @ StatusTypeId始终为true的情况\” 其他条件也一样
WHERE Worksheet.ProjectId = @ProjectId
AND
(
  (@StatusTypeId IS NOT NULL OR
         (@StatusTypeId IS NULL AND StatusType.StatusTypeId IS NULL)
  )
  OR
  (@StatusTypeId <= 0 OR
         (@StatusTypeId > 0 AND StatusType.StatusTypeId = @StatusTypeId)
  )
)