将CASE与WHERE一起使用

时间:2012-09-15 09:20:08

标签: sql sql-server sql-server-2008 tsql

我想在WHERE中使用CASE,所以如果countryId为-1则不选择任何,如果是,则选择值 这是我的非工作代码

 DECLARE @countryId int=-1 --for example
   SELECT * FROM dbo.bbmf WHERE status=1 
 AND countryId =
CASE WHEN @countryId = -1 THEN 
 --select any
ELSE
 countryId=@countryId
END

感谢您的帮助

6 个答案:

答案 0 :(得分:2)

你的问题不明确,所以我看到了你想要达成的两个结果。

首先仅取决于countryID。因此,如果countryID为-1,则不要选择任何记录:

如果你没有countryId是-1,那么你可以使用这个简单的选择,因为,如果@countryID = -1,什么都不会返回(因为AND),如果它不是-1,那么所需的记录将返回:

SELECT * 
FROM dbo.bbmf 
WHERE status=1 
  AND (countryId=@countryId)

(除了第一个解决方案,如果您的国家/地区ID = -1,那么您应该将AND (countryId=@countryId)更改为AND (countryId=@countryId AND @countryId <> -1)

第二个是,如果是countryId = -1,那么您只需要检查状态,并使用status = 1获取每条记录,那么您应该使用以下语句:< / p>

SELECT * 
FROM dbo.bbmf 
WHERE status=1 
  AND (countryId = -1 
     OR countryId = @countryId)

答案 1 :(得分:2)

我喜欢这样:

DECLARE @countryId int=-1 

SELECT * 
FROM dbo.bbmf 
WHERE 
    status=1 
    AND 
    1 = CASE 
        WHEN @countryId = -1 THEN 0
        WHEN countryId=@countryId THEN 1
        ELSE 0 --<<probably don't need the ELSE
    END

答案 2 :(得分:1)

您执行SELECT语句,无论Country Id是否为-1,这是一个冗余呼叫。如果你想在CountryId不等于-1时运行SELECT语句,那么只需在WHERE子句中过滤掉它或使用Conditional

<强>过滤

SELECT * FROM dbo.bbmf 
WHERE status=1 AND countryId != -1

使用条件

IF (@countryId != -1)  
BEGIN
    -- SELECT STATEMENT HERE
END 

答案 3 :(得分:1)

尝试DEMO

SELECT * FROM dbo.bbmf 
WHERE status=1 
AND countryId = @CountryID
AND @countryId <> -1

答案 4 :(得分:0)

SELECT * FROM dbo.bbmf 
WHERE status=1 
AND countryId <> -1

答案 5 :(得分:0)

我找不到您的代码的用例,但可能是您可以使用不可能的where子句运行select,例如:

  

SELECT * FROM dbo.bbmf WHERE status = 1 AND 1&gt; 2

但是,正如有些人所说,如果你不想要任何结果,就不要运行查询。