如何使用MySQL有条件地处理除零

时间:2011-11-23 16:12:15

标签: mysql sql

在MySQL中,此查询可能会抛出除零错误:

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

如果noOfGirls0,则计算失败。

处理此问题的最佳方法是什么?

我希望在noOfGirls等于1时有条件地将0的值更改为{{1}}。

有更好的方法吗?

6 个答案:

答案 0 :(得分:15)

是的,你可以做一个案例:

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

但你可能想要:

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

答案 1 :(得分:11)

您可以使用此(过度表达)方式:

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

如果没有女孩,哪个会出现NULL,这实际上是SQL语义中应该是0/0。

如果你尝试NULL,那么MySQL会给0/0,因为NULL的SQL意思是“没有数据”,或者在这种情况下“我不知道是什么这个值可以是“。

答案 2 :(得分:4)

<强> GREATEST(x, 1)

可以使用,因为女孩的数量必须是正面的:

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

但它在SQL实现中不是很容易移植。

文档:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_greatest

答案 3 :(得分:2)

如果您想将noOfGirls设置为1(如果它为0),那么以下内容应该有效:

SELECT ROUND(noOfBoys / if(noOfGirls, noOfGirls, 1)) as ration FROM student;

答案 4 :(得分:0)

select
    case student.noOfGirls
           when 0 then 1
           else  round(noOfBoys/noOfGirls)
    end as ration
from
    `student`

答案 5 :(得分:0)

除以NULL实际上在MySQL服务器中有效,并返回NULL。因此,您可以这样做:

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

在这种情况下,我认为NULL比率是最准确的。如果您需要比率等于numOfBoys,则可以使用:

SELECT COALESCE(ROUND(noOfBoys / NULLIF(noOfGirls, 0)), noOfBoys) AS ration FROM student;