以下是样本表的脚本
DECLARE @tbl TABLE (ID int)
INSERT INTO @tbl VALUES(1), (2), (NULL), (3), (NULL), (1)
我希望列ID
SELECT * FROM @tbl WHERE ID -- Can't figure out
我可以通过将查询放在字符串中来完成此操作但在长查询中只有一个这样的条件,因此我不想将所有查询都放在字符串中。
编辑:回应@Tim Schmelter。 道歉,我无法说清楚。用户将从前端选择他/她想要的所有行只有给出ID的行或者没有给出ID的行在长查询中,一个条件就像这样
@id INT // Value from front end like 'All', 'Products', 'No Products'
WHERE ID = @ID // Here I can't figure out that how to use one of three conditions
请告诉我如果我仍然无法解释我的问题。我会再试一次。
感谢。
答案 0 :(得分:3)
也许我误解了你的要求,难道不是那么容易吗?
-- 1.) If User want all rows
SELECT * FROM @tbl
-- 2.) If user want rows where ID is NULL
SELECT * FROM @tbl
WHERE ID IS NULL
-- 3.) If user want rows where ID is NOT NULL
SELECT * FROM @tbl
WHERE ID IS NOT NULL
修改:所以你想使用一个参数进行相应的过滤,看看:
SELECT * FROM @tbl
WHERE @FilterID = 1 -- returns all rows
OR ( @FilterID = 2 AND ID IS NULL) -- returns all null-rows
OR ( @FilterID = 3 AND ID IS NOT NULL) -- returns all not null rows
您也可以在where子句中使用CASE
,但it is not recommended。
答案 1 :(得分:0)
您可以向用户显示选项(例如单选按钮),然后将所选选项的值传递给数据库,如:
SELECT * FROM @tbl
WHERE
(@Option = 1)
OR (@Option = 2 AND ID IS NULL)
OR (@Option = 3 AND ID IS NOT NULL)
OR可能会破坏性能,但SQL Server(或任何RDBMS)不会发生短路。情况何时有点强行短路
SELECT * FROM @tbl
WHERE
CASE @Option
WHEN 1 THEN 1
WHEN 2 THEN
CASE WHEN ID IS NULL THEN 1 END
WHEN 3 THEN
CASE WHEN ID IS NOT NULL THEN 1 END
END = 1