Обработать ошибку деления на ноль, обнаруженную ошибку

    SELECT   ((CASE WHEN (qid2.AgeBelow_16 - qid1.AgeBelow_16)= 0 THEN 1 ELSE (qid2.AgeBelow_16- qid1.AgeBelow_16) END )/ (CASE WHEN [qid1].AgeBelow_16= 0 THEN 1 ELSE [qid1].AgeBelow_16  END))*100 AS AgeBelow_16_Percent, 
    -- otherfields

    FROM
    -- whole query

Я использую приведенный выше запрос для вычисления процентной разницы от старого значения и нового значения. основная проблема заключается в том, что 0 если какое-либо значение поля равно 0, то выдается "Делить на ноль ошибка, обнаруженная ошибка", поэтому я использую case when then else end. Вышеупомянутая реализация хороша или может быть написана лучше, чем это, пожалуйста, предложите мне, потому что это больше путаницы, когда поля огромны, например, выше 10.


person Govind Malviya    schedule 04.08.2011    source источник


Ответы (1)


Что-то типа этого наверное?

declare @X int = 0
select 10 / isnull(nullif(@X, 0), 1)
person Mikael Eriksson    schedule 04.08.2011
comment
@Govind KamalaPrakash Malviya: Не обязательно, а если нет, то я ожидаю, что разница будет незначительной. Но вы, вероятно, должны сравнить его самостоятельно. В качестве альтернативы вы можете использовать COALESCE вместо ISNULL и посмотреть, работает ли он лучше (быстрее) для вас. - person Andriy M; 04.08.2011
comment
@Govind - Провел быстрый тест на 100000 строк на очень медленном ноутбуке, и Андрей прав. Это заняло 2,7 секунды с разницей во времени около 50 мс. - person Mikael Eriksson; 04.08.2011