Как избежать ошибки «делить на ноль» в SQL?
В этой статье мы рассмотрим, как избежать ошибки «делить на ноль» в 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;
Выход: