表格一列的三个条件

时间:2012-05-24 10:51:52

标签: sql sql-server-2008 tsql

以下是样本表的脚本

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
  1. 如果用户想要所有行
  2. 如果用户想要ID为NULL的行
  3. 如果用户想要ID为非空的行
  4. 我可以通过将查询放在字符串中来完成此操作但在长查询中只有一个这样的条件,因此我不想将所有查询都放在字符串中。

    编辑:回应@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
    

    请告诉我如果我仍然无法解释我的问题。我会再试一次。

    感谢。

2 个答案:

答案 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