2014-02-16 2 views
1

У меня есть хранимая процедура, которая имеет два параметра:условное где положение в SQL для диапазона дат

@PublishedFrom SMALLDATETIME = NULL, 
@PublishedDeadline SMALLDATETIME = NULL 

Я хочу, чтобы, когда PublishedDeadline равна нулю, то WHERE условие должно иметь:

WHERE (dbo.Vacancies.StartDate >= @PublishedFrom 
     OR @PublishedFrom IS NULL) 

, но если PublishedDeadline не является пустым, то WHERE положение должно быть как

WHERE v.startdate <= @PublishedDeadline 
    and @PublishedFrom <= v.EndDate 

Как я могу применить условное предложение where в SQL?

Пожалуйста, предложите

ответ

4

Следующая должно работать для вас:

WHERE (PublishedDeadline IS NULL 
     AND (
      dbo.Vacancies.StartDate >= @PublishedFrom 
      OR @PublishedFrom IS NULL 
     ) OR (
     PublishedDeadline IS NOT NULL 
     AND v.startdate <= @PublishedDeadline 
     AND @PublishedFrom <= v.EndDate 
     ) 

просто объединить IS NULL/IS NOT NULL условия с другими условиями

+0

Мне нужно добавить чек для PublishedFrom не является нулевой во второй части после ИЛИ? – DotnetSparrow

+0

Это зависит от того, как вы хотите, чтобы запрос вел себя. Без всякой информации о ваших намерениях я не могу ответить на эти вопросы. Но, я могу сказать, что сравнение, подобное 'NULL <= something', даст вам результат« NULL ». – Alexander

+0

@DotnetSparrow Если вы не уверены, просто добавьте 'AND PublishedFrom IS NOT NULL' после того, как' PublishedDeadline IS NOT NULL' – Alexander

0

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

if (@PublishedDeadline is NULL) 
BEGIN 
    Select * from dbo.Vacancies 
    WHERE (dbo.Vacancies.StartDate >= @PublishedFrom 
    OR @PublishedFrom IS NULL) 
END 
else 
BEGIN 
    Select * from dbo.Vacancies 
    WHERE v.startdate <= @PublishedDeadline 
    and @PublishedFrom <= v.EndDate 
END 
Смежные вопросы