Проблем:
Искате да избегнете грешката при деление на нула.
Пример:
Нашата база данни има таблица с име 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 равни на нула липсват в резултатния набор.