避免零做除数

来源:互联网 发布:f盘文件显示无数据 编辑:程序博客网 时间:2024/04/30 00:22
--摘自《SQL HACKS》 by claro ,in 西安 ,  select getdate() --2009-01-06 13:46:26.543
NULLIF是一个少为人知的函数,它在其参数相等时返回NULL。它是回避被零除例外的方便手段。

表达式NULLIF(X,Y)在x和y不同时返回x。如果x和y相同,则返回NULL。
假设你需要计算一对数的比值,但除数有可能为零,如表5-6所示。
表5-6 stats表
page             impressions        clicks
index.htm      1,000                10
page1.htm           0                  0
page2.htm        500                10

要计算每个页面的点进率(CTR),那么就用点击数(clicks)除以页面浏览数量(impressions),再乘上100。由于page1.htm处于脱机状态,它的页面浏览量依然是零,因此,CTR计算将产生被零除错误。这个示例出自SQL Server(其他数据库给出类似错误):
 select  page , 100.0 * clicks / impressions from stats;

page
-------------------
index.htm
msg 8134, level 16,stste 1,server TINYVAIO, Line 1 Divide by zero error encountered.

MySQL不报错,它返回NULL来解决这个问题。

你能够使用NULLIF在浏览数量为零时生产NULL来解决这个问题:
 select  page , 100.0*clicks / NULLIF(impressions,0) from stats;

page
---------------------
index.htm   1.000000000000
page1.htm                   NULL
page2.htm  2.000000000000

在SQL中,任何数值被NULL出都得到NULL值,并且不产生错误。

IFNULL和ISNULL 和NULLIF
IFNULL是一个MySQL函数。它类似与COALESCE 和 NVL 。如果第一个参数不为NULL,那么IFNULL返回第一个函数,否则分会第二个参数。

ISNULL是另一个MySQL函数。当输入为NULL时,ISNULL返回1,否则返回0。

正如本文展示的那样,NULLIF是一个标准的SQL函数,所有主流SQL厂商都支持这个函数。