带有运算符的Where子句中的SQL Case

时间:2013-06-12 06:35:49

标签: sql case

我需要根据以下几点获得一组记录:

  1. 如果(startdateendate不为空,那么opendate应介于startdated enddate之间或(closedate之间startdateenddate
  2. 如果startdate不为空且enddate为空,则为opendate = startdate
  3. 如果startdate为空且enddate不为空,则closedate = enddate
  4. 如果startdateenddate都为空,则它应检索所有数据
  5. 我使用下面的查询尝试了这一点,但它只满足第2点到第4点。

    Select * From CheckDateValues C
    Where 
    1 = 1 and
    
    C.OPenDate >= Case 
                 When (@OpenDate IS NULL) THEN C.OpenDate Else @OpenDate
                 End
    and 
    C.CloseDate <= Case 
              When (@CloseDate IS NULL) THEN C.CloseDate Else @CloseDate
              End 
    

    我不确定如何编写查询以使Point 1也能正常工作。

1 个答案:

答案 0 :(得分:0)

我认为您正在尝试确定两个范围之间的某种形式的重叠 - 一个在表格列中,另一个在变量中。如果是这样,我会给你通常的重叠测试:

Select * From CheckDateValues C
where C.OpenDate <= COALESCE(@CloseDate,C.CloseDate) and
COALESCE(@OpenDate,C.OpenDate) <= C.CloseDate

其中(使用COALESCE消除变量中的NULL值)归结为:

如果符合以下两个时段重叠:

  • 期间1的开始位于期间2的结束之前,
  • 第2期的开始位于第1期的结束之前。

这是一个比大多数人通常想出的更简单的定义,并且避免列举大量案例。