Проблем:
Искате да избегнете грешката при деление на нула.
Пример:
Нашата база данни има таблица с име numbers
с данни в колоните id
, number_a
и number_b
.
id | число_a | число_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
Нека разделим number_a
от number_b
и покажете таблицата с нова колона, divided
, с резултата от деленето.
Решение 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Решение 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Резултатът е:
id | число_a | число_b | разделен |
---|---|---|---|
1 | 4 | 0 | NULL |
2 | 57 | -5 | -11,4000 |
3 | -7 | 56 | -0,1250 |
4 | -67 | 0 | NULL |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2 0000 |
Решение 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Резултатът е:
id | число_a | число_b | разделен |
---|---|---|---|
2 | 57 | -5 | -11,4000 |
3 | -7 | 56 | -0,1250 |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2 0000 |
Дискусия:
Първото решение използва NULLIF()
функция, която приема две числа като аргументи. Когато първият аргумент е равен на другия аргумент, функцията връща NULL
като резултат. Ако number_b
е равно на нула, делителят е NULL
, а резултатът от разделянето е NULL
.
Второто решение използва CASE
изявление. Ако условието след WHEN
ключовата дума е вярна (в нашия случай условието е number_b = 0
), указваме, че NULL се връща. В противен случай разделянето става както обикновено.
Третото решение просто използва WHERE
условие за филтриране на редовете, където number_b
е нула. Редовете с number_b
равни на нула липсват в резултатния набор.