Sql 使用WHERE的CASE
我想在WHERE中使用CASE,因此如果countryId为-1,则不要选择任何值,否则选择值 这是我的非工作代码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 感谢您的帮助您的问题不清楚,
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报告使用的存储过程中经常使用这种结构