我正在 Transact SQL 查询中编写一个表达式,以查找两个日期时间 a、b 的每条记录最小值,其中 a 不能为空但 b 可以为空(在这种情况下返回 a)。
我有以下几点,我认为这是正确的,甚至可能是有效的,但肯定是丑陋的。
我们能做得更好吗?
case when b is null then a else (case when b < a then b else a end) end as min_datetime
最佳答案
在 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;
随着值的数量越来越大,这非常方便。但是,性能可能会比单个表达式稍差(但不会差很多)。
至于单个表达式,我会选择:
case when b is null or a < b then a else b end as min_datetime
这个的表现应该和你的表情基本一样。我觉得这个版本更简单。
关于当 b 可以为空时,SQL 查找两个日期时间值 a、b 的最小值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49404317/