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.