0

以下是示例表的脚本

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 不为 NULL 的行

我可以通过将我的查询放在字符串中来做到这一点,但是在长查询中只有一个这样的条件,所以我不想将所有查询都放在字符串中。

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

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

谢谢。

4

2 回答 2

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

你也可以CASE在 where 子句中使用,虽然不推荐

于 2012-05-24T10:55:35.440 回答
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)不会短路。CASE WHEN 可以在一定程度上强制短路

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
于 2012-05-24T11:00:51.590 回答