2015-06-01 3 views
1

Прежде чем ваш мозг взрывается, я видел this.Функция против Эффективность случая

Мой вопрос с учетом моей конкретной ситуации. Я пытаюсь оптимизировать очень большую базу данных и пытаюсь переписать некоторые вызовы, потому что она была преобразована из Orical DB в MS DB.

У меня есть функция, которая вызывается из хранимой процедуры, которую я хочу заменить, и я думаю, что все будет хорошо, но я не уверен во всех случаях.

Это текущая функция, которая вызывается.

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 

Я хочу заменить вызов функции полностью этим.

select CASE WHEN @date1 >= @date2 THEN @date1 ELSE @date2 END 

Оба они определяют наибольшую дату из 2-х дат, но не уверены, что они охватывают все мои базы.

После тестирования

declare @date1 datetime 
declare @date2 datetime 

set @date1 = '2015-05-01' 
set @date2 = null 

select CASE WHEN @date1 >= @date2 THEN @date1 ELSE @date2 END 

Это возвращает нуль, который является желаемому результату

Вот мой окончательный результат, который будет работать

declare @date1 datetime 
declare @date2 datetime 

set @date1 = null 
set @date2 = '2015-05-01' 

select CASE WHEN @date1 is null or @date2 is null then null WHEN @date1 >= @date2 THEN @date1 ELSE @date2 END 
+2

«Мой вопрос с учетом ...» ... Но вы не задаете никаких вопросов. Какой у Вас вопрос? – Adam

+1

Другое, тогда случай, когда либо «null» да, это эквивалентно. –

+0

RE: Ваша тестовая попытка 'set @ date1 = null set @ date2 = '2015-05-01'' –

ответ

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

Новый сазе здесь не обрабатывает NULL так же, как оригинал. Первоначальный результат будет равен NULL, если исходные данные были пустыми.

0

Если ваш бизнес логики по умолчанию в NULL, ваш код должен тоже. Составители будут благодарны вам.

SELECT CASE 
    WHEN @date1 >= @date2 THEN @date1 
    WHEN @date2 > @date1 THEN @date2 
    ELSE NULL 
END 
Смежные вопросы