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的所有行
我哪里出错
答案 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