在你的大脑爆炸之前我见过this。
我的问题是根据我的具体情况量身定做的。我试图优化一个非常大的数据库,我试图重写一些调用,因为它是从Orical DB转换为MS DB。
我有一个从我想要替换的存储过程调用的函数,我认为它会很好,但我不确定在所有情况下。
这是被调用的当前函数。
List<Parent> ParentObjects=new List<Parent>();
foreach (var searchWord in searchWords)
{
var word = searchWord;
var ParentObject = someParentObjects.FirstOrDefault(x => x.Users.FirstName.ToLower().Contains(word) ||
x.Users
.LastName.ToLower().Contains(word));
if(ParentObject!=null)
ParentObjects.Add(ParentObject);
}
我想完全用这个替换对函数的调用。
ALTER function [dbo].[GREATEST_DATETIME]
(
@i1_p datetime,
@i2_p datetime
)
returns datetime as
begin
declare @r_l datetime
if @i1_p is null or @i2_p is null
return null
set @r_l = @i1_p
if @i2_p > @r_l
set @r_l = @i2_p
return @r_l
end
他们都确定了2个日期中最大的日期,我只是不确定我是否覆盖了我的所有基础。
经过测试
select CASE WHEN @date1 >= @date2 THEN @date1 ELSE @date2 END
返回null,这是期望的结果
这是我的最终结果
declare @date1 datetime
declare @date2 datetime
set @date1 = '2015-05-01'
set @date2 = null
select CASE WHEN @date1 >= @date2 THEN @date1 ELSE @date2 END
答案 0 :(得分:2)
此处的新案例声明不会以与原始语句相同的方式处理NULL
。如果任一源数据为空,则原始结果为NULL
。
答案 1 :(得分:1)
如果其中一个日期为null
,则第一次比较将失败并返回false
。所以你需要额外的null
检查
select CASE WHEN @date1 is null or @date2 is null then null
WHEN @date1 >= @date2 THEN @date1
ELSE @date2
END
答案 2 :(得分:0)
如果您的业务逻辑默认为NULL,那么您的代码也应如此。维护者会感谢你。
SELECT CASE
WHEN @date1 >= @date2 THEN @date1
WHEN @date2 > @date1 THEN @date2
ELSE NULL
END