在WHERE子句中使用IF语句

时间:2014-05-14 12:11:18

标签: if-statement sql-server-2012 where between

我想今天展示所有的propID。

我有DateLive&对于PC表上的每个propID,DateRemoved但有些具有NULL DateRemoved(因为它们仍然存在)。

我需要在我的WHEREe中使用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  )

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

尝试在where子句中插入这个替换括号中的case:

...和((pc.dateremoved IS NOT NULL和pc.datelive和pc.dateremoved之间的c.calendarDate)或(pc.dateremoved IS NULL和pc.datelive&lt; c.calendardate))

答案 2 :(得分: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并填充了两个部分,而不仅仅是没有时间组件的普通日期。