Как избежать ошибки «делить на ноль» в SQL?

Опубликовано: 1 Сентября, 2022

В этой статье мы рассмотрим, как избежать ошибки «делить на ноль» в SQL. Если мы разделим любое число на ноль, это приведет к бесконечности, и мы получим сообщение об ошибке. Мы можем избежать этого сообщения об ошибке, используя следующие три метода:

  • Использование функции NULLIF()
  • Использование оператора CASE
  • Использование ВЫКЛ. ARITHABORT

Сначала мы создадим базу данных для выполнения операций SQL.

Запрос:

CREATE DATABASE Test;

Выход:

Успешно выполненные команды показывают, что база данных «Тест» создана.

Для всех методов нам нужно объявить две переменные, которые будут хранить значения числителя и знаменателя.

DECLARE @Num1 INT;
DECLARE @Num2 INT;

После объявления переменной мы должны установить значения. Установите значение второй переменной равным нулю.

SET @Num1=12;
SET @Num2=0;

Способ 1: использование функции NULLIF()

Если оба аргумента равны, возвращается NULL. Если оба аргумента не равны, возвращается значение первого аргумента.

Синтаксис:

NULLIF(exp1, exp2);

Теперь мы используем функцию NULLIF() в знаменателе с нулевым значением второго аргумента.

SELECT @Num1/NULLIF(@Num2,0) AS Division;
  • На сервере SQL, если мы разделим любое число на значение NULL, его вывод будет NULL.
  • Если первый аргумент равен нулю, это означает, что если значение Num2 равно нулю, то функция NULLIF() возвращает значение NULL.
  • Если первый аргумент не равен нулю, то функция NULLIF() возвращает значение этого аргумента. И деление происходит как обычно.

Вот полный запрос.

Запрос:

DECLARE @Num1 INT;
DECLARE @Num2 INT;
SET @Num1=12;
SET @Num2=0;
SELECT @Num1/NULLIF(@Num2,0) AS Division;

Выход:

Способ 2: использование оператора CASE

Оператор SQL CASE используется для проверки условия и возврата значения. Он проверяет условия до тех пор, пока они не станут истинными, и если ни одно из условий не будет истинным, он вернет значение в другой части.

Мы должны проверить значение знаменателя, то есть значение переменной Num2. Если он равен нулю, верните NULL, в противном случае верните обычное деление.

SELECT CASE
WHEN @Num2=0
THEN NULL
ELSE @Num1/@Num2
END AS Division;

Вот полный запрос:

Запрос:

DECLARE @Num1 INT;
DECLARE @Num2 INT;
SET @Num1=12;
SET @Num2=0;
SELECT CASE
    WHEN @Num2=0
    THEN NULL
    ELSE @Num1/@Num2
END AS Division;

Выход:

Способ 3: ВЫКЛЮЧИТЕ ARITHABORT

Чтобы контролировать поведение запросов, мы можем использовать методы SET. По умолчанию ARITHABORT включен. Он завершает запрос и возвращает сообщение об ошибке. Если мы установим его в OFF, он завершится и вернет значение NULL.

Как и в случае с ARITHBORT, мы должны установить ANSI_WARNINGS в положение OFF, чтобы избежать появления сообщения об ошибке.

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;

Вот полный запрос:

Запрос:

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
DECLARE @Num1 INT;
DECLARE @Num2 INT;
SET @Num1=12;
SET @Num2=0;
Select @num1/@Num2;

Выход: