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

Posted

技术标签:

【中文标题】ms sql server中where子句中的if else条件【英文标题】:if else condition in where clause in ms sql server 【发布时间】:2018-06-22 03:01:44 【问题描述】:

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

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

我见过使用 case when 的例子,但结果不是我想要的。请协助我将此条件转换为正确的 sql 格式。

【问题讨论】:

也可以使用布尔否定奇偶校验条件,例如:.. (b.enddate is null /* positive */ and (..)) or (b.enddate is not null /* negative */ and (..)) 我建议您使用@Susang 提供的解决方案。但是如果你只是有一个 XY 问题并且你只是想知道如何在 'WHERE' 中'IF' 那么你应该看看这个问题***.com/questions/87821/… 【参考方案1】:

您不需要使用case 表达式,这可以在WHERE 子句中使用OR 来完成

... 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)

【讨论】:

【参考方案2】:

我认为我们可以简单地做到这一点,因为在这两种情况下a.starttime &gt;= b.starttime 都适用,所以我们只需要处理a.endtime &lt;= b.endtime 条件,以防b.enddateNULL or NOT NULL 所以我这样做如下:

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

【讨论】:

这是首选的解决方案,因为它只是使用布尔代数来摆脱双项并提供最有效的公式。【参考方案3】:

怎么样:

   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】:

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

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 等)。

【讨论】:

【参考方案5】:

试试这个,先生,

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

谢谢:)

【讨论】:

以上是关于ms sql server中where子句中的if else条件的主要内容,如果未能解决你的问题,请参考以下文章

简述SELECT语句中的FROM、WHERE以及ORDER BY子句的作用。SQL Server

where 子句中的 case 语句 - SQL Server

SQL Server If 条件在 where 子句?

SQL:WHERE 子句中的 IF/CASE 语句

WHERE 子句中的 SQL 查询子选择优化 (SQL Server)

WHERE 子句中的 OR 会降低 sql 查询性能(sql server)