我正在 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)
在 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)
其表现应该与你的表达基本相同。我觉得这个版本更简单。