2012-05-24 4 views
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. Если пользователю нужны строки, где идентификатор NOT NULL

Я могу сделать это, поставив свой запрос в строку, но в длинном запросе есть только одно условие, так что я не хочу помещать весь запрос в строку.

EDIT: В ответ на @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

Вы можете представить пользователю выбор (например, кнопка радио), а затем передать значение выбранного варианта к базе данных, как:

SELECT * FROM @tbl 
WHERE 
    (@Option = 1) 
    OR (@Option = 2 AND ID IS NULL) 
    OR (@Option = 3 AND ID IS NOT NULL) 

ИЛИ может убить производительность, хотя, 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 
+0

У вас есть @Michael – Kashif

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 

Edit: Так что вы хотите использовать параметр для фильтрации соответственно, имеют вид:

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 в ИНЕКЕ, хотя it is not recommended.

+0

Пожалуйста, смотрите мой выбор. – Kashif

+0

@MuhammadKashifNadeem: Отредактировал мой ответ. –

+0

Спасибо Тиму, так мило с твоей стороны! – Kashif

Смежные вопросы