2011-11-23 33 views
15

En MySQL, esta consulta podría lanzar una división por error cero:Cómo manejar condicionalmente la división por cero con MySQL

SELECT ROUND(noOfBoys/noOfGirls) AS ration 
FROM student; 

Si noOfGirls es 0 entonces 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 una manera mejor?

+5

MySQL no tira división por cero errores. –

+2

@UncleIroh Depende de la configuración de MySQL. Si el servidor MySQL tiene habilitado el modo 'ERROR_FOR_DIVISION_BY_ZERO', emitirá un error cuando ocurra una división por cero. – Metafaniel

+0

@Metafaniel Interesante Yo no sabía eso. Gracias. –

Respuesta

11

Sí, se puede hacer un caso:

select case when noOfGirls=0 then noOfBoys 
     else round(noOfBoys/noOfGirls) end as ration 
from student; 

Pero es probable que desee:

select case when noOfGirls=0 then 1 
     else round(noOfBoys/noOfGirls) end as ration 
from student; 
7

Se puede usar esta forma (sobre-expresión):

select IF(noOfGirls=0, NULL, round(noOfBoys/noOfGirls)) as ration from student; 

Qué pondrá NULL si no hay chicas, que es efectivamente lo que 0/0 debería ser en semántica SQL.

MySQL de todos modos dar NULL si intenta hacer 0/0, como el significado de SQL fo NULL es "sin datos", o en este caso "no sé lo que puede ser este valor".

2

Bueno, si desea establecer noOfGirls a 1 si es 0, el siguiente debería funcionar:

SELECT ROUND(noOfBoys/if(noOfGirls, noOfGirls, 1)) as ration FROM student; 
0
select 
    case student.noOfGirls 
      when 0 then 1 
      else round(noOfBoys/noOfGirls) 
    end as ration 
from 
    `student` 
3

GREATEST(x, 1) puede ser utilizado desde el número de niñas debe ser positivo:

SELECT ROUND(noOfBoys/GREATEST(noOfGirls, 1)) AS ration FROM student; 

Pero no es muy portátil en las implementaciones de SQL.

0

comprueba si el denominador es cero y el nominador no es NULO - si es así, utiliza 'NaN'.

Cuestiones relacionadas