Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
Sql 使用WHERE的CASE_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 使用WHERE的CASE

Sql 使用WHERE的CASE,sql,sql-server,sql-server-2008,tsql,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 感谢您的帮助您的问题不清楚,

我想在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

感谢您的帮助

您的问题不清楚,因此我看到了两个您可能希望实现的结果

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

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

SELECT * 
FROM dbo.bbmf 
WHERE status=1 
  AND (countryId=@countryId)
(除了第一个解决方案之外,如果您的国家id为-1,那么您应该将
和(countryId=@countryId)
更改为
和(countryId=@countryId和@countryId-1)

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

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

执行
SELECT
语句时,无论国家/地区Id是否为-1,这都是多余的调用。如果要在CountryId不等于-1时运行SELECT语句,则只需在
WHERE
子句中过滤掉它,或使用
条件语句:

过滤:

SELECT * FROM dbo.bbmf 
WHERE status=1 AND countryId != -1
IF (@countryId != -1)  
BEGIN
    -- SELECT STATEMENT HERE
END 
使用条件:

SELECT * FROM dbo.bbmf 
WHERE status=1 AND countryId != -1
IF (@countryId != -1)  
BEGIN
    -- SELECT STATEMENT HERE
END 
试一试

从dbo.bbmf中选择*
其中status=1
和countryId=@countryId
以及@countryId-1
从dbo.bbmf中选择*
其中status=1
和countryId-1

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

从dbo.bbmf中选择*,其中状态=1,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
DECLARE@countryId int=-1
选择*
来自dbo.bbmf
哪里
状态=1
及
1=案例
当@countryId=-1时,则为0
当countryId=@countryId时,则为1

ELSE 0——如果您不想在
countryId=-1
中选择任何行,只需不运行select?select不是唯一的,在case之前有status=1如果您不想返回任何行,其他where子句无关紧要。根本不要运行select。表中是否有countryID=-1?但是在where子句中我可以将“status=1和..”@JustMe放在哪里。这是您可以应用诸如status=1之类的过滤器的地方。我可以使用以下方法:从dbo.bbmf中选择*,其中status=1,如果(@countryId!=-1)BEGIN countryId=@countryIdEND@JustMe-这行不通-SELECT语句需要进入条件中(正如我的答案所示)。在BEGIN子句之后,添加Select*from dbo.bbmf,其中status=1这是正确的一个,但它应该是
where status=1和(@countryId 1或countryId=@countryId)
它不会像中那样工作。你应该像我写的那样写。非常确定1>2会返回false我在SSRS报告使用的存储过程中经常使用这种结构