在特定情况下在SQL Server中除以零

时间:2018-12-05 09:38:30

标签: sql sql-server

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

select ((((57151130.0000000000)+(57612530.0000000000))/2)/((12548020.0000000000)-(34321580.0000000000)+(21773560.0000000000)))*366

2 个答案:

答案 0 :(得分:5)

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

NULLIF带有2个参数。如果参数的2个表达式的值相同,则NULLIF返回NULL,否则返回第一个表达式的值。例如(按字面意思):

SELECT NULLIF(1,0), NULLIF('a' + 'b' + 'c','abc');

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

SELECT (((57151130.0000000000+57612530.0000000000)/2)/NULLIF(12548020.0000000000-34321580.0000000000+21773560.0000000000,0))*366

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

然后,如果除数下的表达式的值为0,则将返回值NULL。考虑到NULL代表一个未知值,而{expr}/0当然也是一个未知值,那么该值将是最合适的。

如果随后需要以特定方式表示NULL值,则可以将 whole 表达式包装在另外的ISNULL中。

答案 1 :(得分:0)

此外,您可以使用CASE检查零值语句:

select (
(((57151130.0000000000)+(57612530.0000000000))/2)
/    
CASE WHEN((12548020.0000000000)-(34321580.0000000000)+(21773560.0000000000)) = 0 THEN NULL
ELSE ((12548020.0000000000)-(34321580.0000000000)+(21773560.0000000000))
END
)*366