在MySQL中,此查询可能会抛出除零错误:
SELECT ROUND(noOfBoys / noOfGirls) AS ration
FROM student;
如果noOfGirls
为0
,则计算失败。
处理此问题的最佳方法是什么?
我希望在noOfGirls
等于1
时有条件地将0
的值更改为{{1}}。
有更好的方法吗?
答案 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;