SQL where子句的情况

时间:2014-12-09 18:27:05

标签: sql sql-server

SELECT     
*
FROM  tbl_Something
WHERE 
RoleID = 1 AND 
GroupID = 
    CASE
        WHEN @GroupID = 1 THEN @GroupID OR GroupID IS NULL -- issue here
        WHEN @GroupID = 2 THEN @GroupID

我想做的是 当@GroupID = 2时,GroupID = @GroupID意味着获取groupID = 2的所有行 当@GroupID == 1然后GroupID = @GroupID或GroupID IS NULL意味着获取GroupID = 1或GroupID IS NULL的所有行

我哪里出错

4 个答案:

答案 0 :(得分:2)

您需要拆分条件,因为OR GroupID IS NULL不能成为选择GroupID进行比较的表达式的一部分。由于@GroupID只有两种可能性,因此在没有CASE的情况下重写查询会更简洁:

SELECT     
*
FROM  tbl_Something
WHERE 
RoleID = 1 AND (
    (@GroupID = 1 AND GroupID = 1)
    OR
    (@GroupID = 2 AND (GroupID = 2 OR GroupID IS NULL))
)

答案 1 :(得分:1)

您可以使用ISNULL。 它将测试GroupId是否等于@GroupId,如果GroupId为空则会检查1是否等于@GroupID

ISNULL(GroupID,2) = @GroupID 

答案 2 :(得分:1)

使用Coalesece或IsNull:

WHEN Coalesce(@GroupID, 1) = 1 THEN 1

另外,请注意,当您测试1时,如果您只返回1则更容易阅读。

答案 3 :(得分:1)

为什么要在执行此操作时完全使用CASE WHEN

SELECT     
    *
FROM
    tbl_Something
WHERE 
    RoleID = 1 AND 
    ISNULL(GroupID, 1) = @GroupID

...除非你需要确保如果@GroupID不是1或2,查询不能返回任何内容,在这种情况下,以下情况会更好:

IF @GroupId IN (1, 2)
BEGIN
    SELECT     
        *
    FROM
        tbl_Something
    WHERE 
        RoleID = 1 AND 
        ISNULL(GroupID, 1) = @GroupID
END