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.