功能与案例效率

时间:2015-06-01 19:03:36

标签: sql sql-server tsql

在你的大脑爆炸之前我见过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 

3 个答案:

答案 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