在sql server中,在特定情况下除以零

Gir*_*und -4 sql sql-server

对于以下语句,我得到零除错误.

select ((((57151130.0000000000)+(57612530.0000000000))/2)/((12548020.0000000000)-(34321580.0000000000)+(21773560.0000000000)))*366
Run Code Online (Sandbox Code Playgroud)

Lar*_*rnu 5

您提供文字值的事实有点奇怪,但是,一种避免除以0错误的方法是使用NULLIF(Transact-SQL).

NULLIF需要2个参数.如果参数的2个表达式的值是相同的值,则NULLIF返回NULL,否则返回第一个表达式的值.例如(用字面意思):

SELECT NULLIF(1,0), NULLIF('a' + 'b' + 'c','abc');
Run Code Online (Sandbox Code Playgroud)

这将返回值1NULL.对于您的查询,格式将是:

SELECT (((57151130.0000000000+57612530.0000000000)/2)/NULLIF(12548020.0000000000-34321580.0000000000+21773560.0000000000,0))*366
Run Code Online (Sandbox Code Playgroud)

注意我已经删除了几个括号,因为不需要在一对中包装每个值/表达式.这样做可能会降低可读性.

然后,如果除数下的表达式具有该值0,NULL则将返回该值.考虑到它NULL代表一个未知值,并且{expr}/0当然也是一个未知值,该值将是最合适的.

如果您需要以NULL特定方式表示值,则可以将整个表达式进一步包装ISNULL.