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 >= b.starttime
都适用,所以我们只需要处理a.endtime <= b.endtime
条件,以防b.enddate
是NULL 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