SQL 查找两个日期时间值 a,b 中的最小值(当 b 可以为 null 时)

Rob*_*b B 5 sql t-sql

我正在 Transact SQL 查询中编写一个表达式,以查找两个日期时间 a、b 的每条记录的最小值,其中 a 不能为 null,但 b 可以为 null(在这种情况下返回 a)。

我有以下内容,我认为这是正确的,甚至可能是有效的,但肯定是丑陋的。

我们可以做得更好吗?

case when b is null then a else (case when b < a then b else a end) end as min_datetime
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 4

在 SQL Server 中,您可以通过横向联接来完成此操作。正确的语法是:

select t.*, v.min_dte
from t cross apply
     (select min(v.dte) as min_dte
      from values ( (t.a), (t.b) ) v(dte)
     ) v;
Run Code Online (Sandbox Code Playgroud)

当值的数量变大时,这非常方便。但是,性能可能会比单个表达式稍差(但不会差很多)。

至于单个表达式,我会选择:

case when b is null or a < b then a else b end as min_datetime
Run Code Online (Sandbox Code Playgroud)

其表现应该与你的表达基本相同。我觉得这个版本更简单。