ms sql server中where子句中的if else条件

时间:2018-06-22 03:01:45

标签: sql sql-server tsql case-when

我正在尝试根据以下2种条件从联接的表中检索记录:

Where if(b.enddate is null)
         a.starttime >= b.starttime
      else
         a.starttime >= b.starttime and a.endtime <= b.endtime

我看到了一些使用case的示例,但是结果不是我想要的。请协助我将此条件转换为正确的sql格式。

5 个答案:

答案 0 :(得分:5)

您不需要使用WHERE表达式,可以使用... Where ( b.enddate is null and a.starttime >= b.starttime) or ( b.enddate is not null and a.starttime >= b.starttime and a.endtime <= b.endtime) 子句中的{{1}}来完成

{{1}}

答案 1 :(得分:3)

我认为我们可以简单地做到这一点,因为在两种情况下a.starttime >= b.starttime都是适用的,因此在{{1}的情况下,我们只需要处理a.endtime <= b.endtime条件}是b.enddate,所以我按如下操作:

NULL or NOT NULL

答案 2 :(得分:2)

为简单起见,您可以尝试以下示例条件逻辑:

DECLARE @enddate datetime2(7);
SET @enddate = NULL;

SELECT @enddate;

IF @enddate IS NULL
    SELECT 1, 2 FROM dbo.table_a as a
    INNER JOIN dbo.table_b as b ON a.id = b.id
    WHERE a.starttime >= b.starttime
ELSE
    SELECT 1, 2 FROM dbo.table_a as a
    INNER JOIN dbo.table_b as b ON a.id = b.id
    WHERE a.starttime >= b.starttime and a.endtime <= b.endtime

这为您提供了2个独立执行计划的好处。因此,如果您决定优化SQL语句,则操作会容易得多(例如建立索引,计划稳定性,移至sp等)。

答案 3 :(得分:1)

那:

   WHERE (b.enddate is null AND a.starttime >= b.starttime) OR (b.enddate is not null AND a.starttime >= b.starttime and a.endtime <= b.endtime) 

答案 4 :(得分:1)

试试这个先生,

   where (b.enddate is null and a.starttime >= b.starttime) OR (a.starttime >= b.starttime and a.endtime <= b.endtime) 

谢谢:)