Ошибка деления на ноль, обнаруженная в моем запросе

#sql #sql-server

#sql #sql-сервер

Вопрос:

Всякий раз, когда я запускаю этот запрос:

  SELECT
     Call_DT, 
     CAST(Talk_Sec_Count   Alloc_Sec_Count AS DECIMAL(16, 4)) AS Talk,
     CAST(CT_Count * 1.0 - NP_Count  / CT_Count * 1.0 AS DECIMAL(16, 4)) AS Quality,
     Pymt_Rtn_Rt AS Utilization,
     Agent_UID
 FROM 
     [TableName] 
 WHERE
     [Call_Date]  <= 13 
 

Я получаю эту ошибку:

Сообщение 8134, уровень 16, состояние 1, строка 31
, ошибка деления на ноль.

Вопрос: что мне нужно сделать, чтобы вставить «НОЛЬ» в таблицу, чтобы избежать этой ошибки?

Ответ №1:

Используйте NULLIF() :

  CAST(CT_Count * 1.0 - NP_Count  / NULLIF(CT_Count * 1.0, 0) AS DECIMAL(16, 4)) AS Quality,
 

Это возвращает NULL , если знаменатель равен 0 — предотвращение ошибки.

Комментарии:

1. Если CT_Count равно null, не NULLIF(CT_Count * 1.0, 0) будет возвращать 0? Что все равно приведет к делению на 0?

2. Это NULLIF не ISNULL так, @Andrew . Если первое выражение возвращает второе, то NULL возвращается, в противном случае значение выражения равно. Если значение первого выражения равно NULL , то (в этом примере) это не равно 0 и поэтому NULL возвращается.

3. @Larnu — вы абсолютно правы. IS NULL <> NULLIF , несмотря на то, что думает мой мозг…

4. IS NULL это тоже совсем другое дело для ISNULL @Andrew 😉