Problema:
Você deseja realizar a divisão em sua consulta SQL, mas o denominador é uma expressão que pode ser zero. O banco de dados apresentará um erro quando o denominador for de fato zero.
Exemplo:
Nosso banco de dados tem uma tabela chamada
investor_data
com dados nas seguintes colunas:id
, investor_year
, price_per_share
, income
, e expenses
. id | investidor_ano | price_per_share | renda | despesas |
---|---|---|---|---|
1 | 2016 | 20 | 3200 | 2300 |
2 | 2017 | 130 | 2000 | 2000 |
3 | 2018 | 40 | 200 | 100 |
4 | 2019 | 15 | 5900 | 4900 |
Vamos dividir o preço por ação pela diferença entre receitas e despesas para determinar a relação P/L (relação preço-lucro) para cada ano. Observe que há casos em que as receitas são iguais às despesas, então a diferença delas será zero. Assim, precisamos encontrar uma maneira de evitar a divisão por zero.
Solução:
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
Essa consulta retorna a relação P/L para cada ano, conforme descrito na declaração do problema:
investor_year | P_E_ratio |
---|---|
2016 | 0,0222 |
2017 | NULO |
2018 | 0,4000 |
2019 | 0,0150 |
Se a diferença entre receitas e despesas for zero (como é o caso de 2017), o
NULLIF
função altera o zero para um valor NULL. Portanto, a divisão por zero fornece NULL no resultado. Discussão:
Se você quiser lidar com a divisão por zero normalmente, você pode usar o
NULLIF
função. NULLIF
recebe dois argumentos:a expressão de interesse e o valor que você deseja substituir. Se o primeiro argumento for igual ao segundo, então NULLIF
retorna NULO; caso contrário, ele retorna o primeiro argumento. Você pode usar esta função para lidar com uma possível divisão por zero envolvendo o denominador em uma chamada para
NULLIF
. Em nosso exemplo, se a diferença entre receitas e despesas for zero, esse valor será alterado para NULL e o denominador na divisão será NULL, não zero. Solução 2:use WHERE
Claro, em algumas situações, você pode usar uma solução mais simples:Apenas evite a divisão por zero usando
WHERE
com o operador de comparação <>. Em nosso exemplo, poderíamos verificar se as receitas-despesas são diferentes de 0. Se for, o cálculo será retornado. SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
Observe que com o
WHERE
solução, você terá menos linhas do que há no investor_date
tabela. As linhas onde as receitas e despesas são iguais não serão mostradas no resultado final.