SQL HELP - Условное условие where на основе переменной BIT - SQL Server - PullRequest
9 голосов
/ 09 марта 2009

Мне нужна помощь в написании условного предложения where. вот моя ситуация:

У меня есть битовое значение, которое определяет, какие строки возвращать в операторе выбора. Если значение равно true, мне нужно вернуть строки, в которых столбец import_id не равен нулю, если false, то я хочу, чтобы строки, в которых столбец import_id был равен нулю.

Моя попытка выполнить такой запрос (ниже), похоже, не работает, каков наилучший способ сделать это?


DECLARE @imported BIT

SELECT id, import_id, name FROM Foo WHERE
    (@imported = 1 AND import_id IS NOT NULL)
    AND (@imported = 0 AND import_is IS NULL)

Спасибо.

Ответы [ 3 ]

15 голосов
/ 09 марта 2009

Измените AND на OR

DECLARE @imported BIT

SELECT id, import_id, name FROM Foo WHERE
    (@imported = 1 AND import_id IS NOT NULL)
    OR (@imported = 0 AND import_is IS NULL)

Разложение вашего исходного заявления

вы, по сути, написали

    @imported = 1 
    AND import_id IS NOT NULL
    AND @imported = 0 
    AND import_is IS NULL

что эквивалентно

    @imported = 1 AND @imported = 0 
    AND import_id IS NOT NULL AND import_is IS NULL

что приводит к двум парам предложений, которые полностью отрицают друг друга

2 голосов
/ 09 марта 2009

Я думаю, вы имели в виду

SELECT id, import_id, name FROM Foo WHERE
    (@imported = 1 AND import_id IS NOT NULL)
    OR (@imported = 0 AND import_is IS NULL)
    ^^^
1 голос
/ 09 марта 2009

Ваш запрос потребует ИЛИ для выбора между различными фильтрами. Оптимизатору лучше, если в этом случае вы используете отдельные запросы. Да, избыточность кода плохая, но для оптимизатора это радикально разные (и не избыточные) запросы.

DECLARE @imported BIT

IF @imported = 1
  SELECT id, import_id, name
  FROM Foo
  WHERE import_id IS NOT NULL
ELSE
  SELECT id, import_id, name
  FROM Foo
  WHERE import_id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...