2012-01-16 5 views
1

Я хочу сделать запрос с помощью условного выражения для выбора условия для фильтра. Что-то вроде этого.Sql условный оператор where where

SELECT Id,name,last_name,submitDate,lastvisitDate 
from Visitor Where if(submitDate is not null) begin submitDate >= @dateFrom end 
and if(submitDate is not null) begin submitDate < @dateTo end 

, но мне нужно, например, если @dateTo is null эта переменная не участвует в запросе фильтра

ответ

1

Вы можете применить ISNULL к @dateTo и, таким образом дефолту это в какой-то очень далеком будушем , такие как 30000101:

… 
WHERE submitDate IS NULL 
    OR submitDate >= @dateFrom AND submitDate < ISNULL(@dateTo, '30000101') 
+0

, но если вы говорите, что NULL, выбор будет искать нулевые значения в этом поле? – jcvegan

+0

@JuanCarlosVegaNeira: Нет, ['ISNULL()'] (http://msdn.microsoft.com/en-us/library/ms184325.aspx «ISNULL (Transact-SQL)») просто возвращает второй аргумент, если первый один - NULL, иначе он возвращает первый аргумент. В моем примере ISNULL эффективно предоставляет значение по умолчанию для '@ dateTo', если оно NULL. Итак, если '@ dateTo' * равно * NULL,' submitDate' будет сравниваться с очень большим значением, которое будет таким же, как если бы мы просто проигнорировали это условие, потому что оно обязательно вернет 'true'. –

+0

Это прекрасно работает, спасибо! – jcvegan

1
select * from Visitor where (submitDate is null or submitDate >= @dateFrom) and (submitDate is null or submitDate < @dateTo) 
+1

'(А или В) и (А или С) = А или (B и C). Поэтому ваше предложение эквивалентно 'submitDate имеет значение null или (submitDate> = @dateFrom и submitDate <@dateTo)'. –

2
where (submitDate is null or (submitDate >= @dateFrom and submitDate < @dateTo)) 
0

Я обновил ГДЕ раздел вашего примера запроса, так что записи будут включены в результаты, если submitDate равно нулю или если submitDate между @dateFrom и @dateTo

SELECT Id, name, last_name, submitDate, lastvisitDate 
FROM Visitor 
WHERE (submitDate IS NULL) OR ((submitDate >= @dateFrom) AND (submitDate < @dateTo)) 
Смежные вопросы