Database
 sql >> Base de Dados >  >> RDS >> Database

Como lidar com a divisão por zero no SQL

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.