tipos - sentencias mysql
Cómo manejar condicionalmente la división por cero con MySQL (6)
En MySQL, esta consulta puede generar un error de división por cero:
SELECT ROUND(noOfBoys / noOfGirls) AS ration
FROM student;
Si noOfGirls
es 0
, el cálculo falla.
¿Cuál es la mejor manera de manejar esto?
Me gustaría cambiar condicionalmente el valor de noOfGirls
a 1
cuando es igual a 0
.
¿Hay alguna manera mejor?
Bueno, si quieres establecer noOfGirls en 1 si es 0, entonces debería funcionar lo siguiente:
SELECT ROUND(noOfBoys / if(noOfGirls, noOfGirls, 1)) as ration FROM student;
Puedes usar esta forma (sobre-expresiva):
select IF(noOfGirls=0, NULL, round(noOfBoys/noOfGirls)) as ration from student;
Lo que sacará NULL si no hay chicas, que es efectivamente lo que 0/0 debería ser en la semántica de SQL.
De todos modos, MySQL dará NULL
si intenta hacer 0/0
, ya que el significado de SQL para NULL
es "sin datos", o en este caso "No sé cuál puede ser este valor".
Sí, puedes hacer un caso:
select case when noOfGirls=0 then noOfBoys
else round(noOfBoys/noOfGirls) end as ration
from student;
Pero probablemente quieras:
select case when noOfGirls=0 then 1
else round(noOfBoys/noOfGirls) end as ration
from student;
verifique si el denominador es cero y el nominador no es NULL - si es así, use ''NaN''.
GREATEST(x, 1)
Se puede usar ya que el número de chicas debe ser positivo:
SELECT ROUND(noOfBoys / GREATEST(noOfGirls, 1)) AS ration FROM student;
Pero no es muy portátil a través de implementaciones de SQL.
Documentación: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_greatest
select
case student.noOfGirls
when 0 then 1
else round(noOfBoys/noOfGirls)
end as ration
from
`student`