Problema:
Você gostaria de evitar o erro de divisão por zero.
Exemplo:
Nosso banco de dados tem uma tabela chamada
numbers com dados nas colunas id , number_a e number_b . | id | número_a | número_b |
|---|---|---|
| 1 | 4 | 0 |
| 2 | 57 | -5 |
| 3 | -7 | 56 |
| 4 | -67 | 0 |
| 5 | 23 | 55 |
| 6 | -8 | -4 |
Vamos dividir
number_a por number_b e mostre a tabela com uma nova coluna, divided , com o resultado da divisão. Solução 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Solução 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
O resultado é:
| id | número_a | número_b | dividido |
|---|---|---|---|
| 1 | 4 | 0 | NULO |
| 2 | 57 | -5 | -11,4000 |
| 3 | -7 | 56 | -0,1250 |
| 4 | -67 | 0 | NULO |
| 5 | 23 | 55 | 0,4182 |
| 6 | -8 | -4 | 2,0000 |
Solução 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
O resultado é:
| id | número_a | número_b | dividido |
|---|---|---|---|
| 2 | 57 | -5 | -11,4000 |
| 3 | -7 | 56 | -0,1250 |
| 5 | 23 | 55 | 0,4182 |
| 6 | -8 | -4 | 2,0000 |
Discussão:
A primeira solução usa o
NULLIF() função, que recebe dois números como argumentos. Quando o primeiro argumento é igual ao outro argumento, a função retorna NULL como resultado. Se number_b é igual a zero, o divisor é NULL , e o resultado da divisão é NULL . A segunda solução usa o
CASE demonstração. Se a condição após o WHEN palavra-chave é verdadeira (no nosso caso, a condição é number_b = 0 ), especificamos que NULL seja retornado. Caso contrário, a divisão acontece normalmente. A terceira solução simplesmente usa o
WHERE condição para filtrar as linhas onde number_b é zero. As linhas com number_b igual a zero estão faltando no conjunto de resultados.