2014-05-14 223 views
1

我想今天显示所有的propID。在WHERE子句中使用IF语句

我有DateLive & DateRemoved在PC表上的每个propID,但有些有一个NULL DateRemoved(因为他们仍然活着)。

我需要在我的WHERE中使用IF(CASE)语句来执行此操作。

喜欢的东西...

今天在那里的, AND(如果他们没有DateRemoved)然后datelive < CalendarDate 或者如果它们卸下的日期,然后CalendarDate是DateLive和DateRemoved之间)

SELECT 

C.CalendarDate, 
PC.propID 

FROM Calendar C 
CROSS join PropertyCounts PC 

Where C.CalendarDate = getdate() 

AND 
(CASE 
WHEN PC.DateRemoved <>NULL THEN C.CalendarDate BETWEEN PC.DateLive AND PC.Dateremoved 
WHEN PC.DateRemoved = NULL THEN PC.DateLive < C.CalendarDate ) 

回答

1
where C.CalendarDate = getdate() 
    AND ((PC.DateRemoved is not null AND C.CalendarDate between PC.DateLive AND PC.Dateremoved) 
     OR 
     (PC.DateRemoved is null AND PC.DateLive < C.CalendarDate) 
     ) 

您已经在使用Where子句的IF语句中。只需要构建布尔逻辑,当选择特定记录时,逻辑逻辑的计算结果为TRUE。

0

尝试插入这对您的where子句中替代的parenthesi情况S:

...和((pc.dateremoved IS NOT NULL和pc.datelive之间c.calendarDate和pc.dateremoved)或(pc.dateremoved IS NULL和pc.datelive < c.calendardate))

0

你并不需要一个CASE表达的复杂性(或IF语句),只是布尔逻辑与ANDOR

Where C.CalendarDate = getdate() 

AND 
(
    (PC.DateRemoved IS NOT NULL AND 
     C.CalendarDate BETWEEN PC.DateLive AND PC.Dateremoved) 
    OR 
    (PC.DateRemoved IS NULL AND PC.DateLive < C.CalendarDate) 
) 

您可能还需要做一些摆弄周围,从getdate()移除时间组件,例如你的第一个条件可能需要:

Where C.CalendarDate = CONVERT(date,getdate()) 

因为getdate()与收益两个部分一个datetime填充,不只是一个普通的日子,没有时间部分。