sql >> Base de Datos >  >> RDS >> Database

Cómo manejar la división por cero en SQL

Problema:

Desea realizar una división en su consulta SQL, pero el denominador es una expresión que puede ser cero. La base de datos le dará un error cuando el denominador sea cero.

Ejemplo:

Nuestra base de datos tiene una tabla llamada investor_data con datos en las siguientes columnas:id , investor_year , price_per_share , income y expenses .

id año_inversor precio_por_acción ingresos gastos
1 2016 20 3200 2300
2 2017 130 2000 2000
3 2018 40 200 100
4 2019 15 5900 4900

Dividamos el precio por acción por la diferencia entre los ingresos y los gastos para determinar la relación P/E (relación precio-beneficio) para cada año. Observe que hay casos en que los ingresos son iguales a los gastos, por lo que su diferencia será cero. Por lo tanto, necesitamos encontrar una manera de evitar la división por cero.

Solución:

SELECT investor_year,
  price_per_share/NULLIF(income-expenses, 0)  AS P_E_ratio
FROM investor data;

Esta consulta devuelve la relación P/E para cada año como se describe en el enunciado del problema:

investor_year P_E_ratio
2016 0.0222
2017 NULO
2018 0.4000
2019 0.0150

Si la diferencia entre ingresos y gastos es cero (como es el caso de 2017), el NULLIF La función cambia el cero a un valor NULL. Por lo tanto, la división por cero da NULL en el resultado.

Discusión:

Si desea manejar la división por cero con gracia, puede usar el NULLIF función. NULLIF toma dos argumentos:la expresión de interés y el valor que desea anular. Si el primer argumento es igual al segundo, entonces NULLIF devuelve NULL; de lo contrario, devuelve el primer argumento.

Puede usar esta función para manejar una posible división por cero envolviendo el denominador en una llamada a NULLIF . En nuestro ejemplo, si la diferencia entre ingresos y gastos es cero, este valor se cambiará a NULL y el denominador en la división será NULL, no cero.

Solución 2:usa WHERE

Por supuesto, en algunas situaciones, puede usar una solución más simple:simplemente evite la división por cero usando WHERE con el operador de comparación <>. En nuestro ejemplo, podríamos comprobar si ingresos-gastos es diferente de 0. Si lo es, se devolverá el cálculo.

SELECT investor_year,
  price_per_share/(income-expenses) AS P_E_ratio
FROM investor data
WHERE (income-expenses) <> 0 ;

Tenga en cuenta que con WHERE solución, obtendrá menos filas de las que hay en el investor_date mesa. Las filas donde los ingresos y los gastos son iguales no se mostrarán en el resultado final.