如何避免在SQL查询中除以零?

时间:2013-12-24 19:30:47

标签: sql

在我的网站中,作者可以上传他们的图书。 我在每个页面上显示统计数据,我显示的统计数据之一是作者书籍的平均评分。 我把所有评级的总和除以书的数量:

select 
    sum(BookRate)/count(BookID) as AvrageRate 
from Books 
where Author = "Some Author"

当用户尚未上传任何图书并且返回明显的错误消息时,会出现问题:

Divide by zero error encountered.

有没有办法在SQL查询中避免这种情况,或者我是否必须首先使用一个查询检查图书计数,然后对统计信息运行另一个查询?

谢天谢地。

3 个答案:

答案 0 :(得分:5)

您可以使用CASE来满足零的总和:

select case sum (BookID) 
    when 0 then 0
    else sum (BookRate)/sum (BookID) 
end as AvrageRate 
from Books where Author="Some Author"
顺便说一句,你不想除以计数,而不是求和得到平均值吗?:

select case count(BookID) 
    when 0 then 0
    else sum (BookRate)/count(BookID) 
end as AvrageRate 
from Books where Author="Some Author"

答案 1 :(得分:3)

如果您使用的是Oracle

,则可以使用NULLIF()
NULLIF( 0, 0 )

在SQL Server中,您也可以尝试:

Select dividend / nullif(divisor, 0)

所以在你的情况下,它可能是这样的:

select sum (BookRate)/nullif(sum (BookID),0) as AvrageRate 
from Books where Author="Some Author"

答案 2 :(得分:3)

如果用户没有上传任何图书,那么我不相信你会得到一个被零除错误。相反,不会返回任何行。

无论如何,最安全的方法是使用case语句:

select (case when sum(BookId) > 0 then sum(BookRate)/count(BookID) end) as AvrageRate
from Books
where Author="Some Author";

或者,对于这种特殊情况,使用avg()聚合函数:

select avg(BookRate) as AvrageRate
from Books
where Author="Some Author";