我正在努力解决这个问题,但无法实现。
从我到目前为止发现的情况来看,我认为我需要为每个除数使用nullif
子句,但是当我尝试这样做时它仍然无效。
以下是没有nullif
的声明产生零除错误。
(1 - (1 - (x1.hup / (x1.hup / (x1.dp / 100)))) / (1 - (x2.sdp / 100)))
答案 0 :(得分:2)
可能有更简单的方法来表达这一点。我认为这就是你所需要的:
(1 - (1 - (x1.hup / (x1.hup / nullif(x1.dp / 100, 0)))) / nullif(1 - (x2.sdp / 100)), 0))
答案 1 :(得分:0)
这不是答案
创建一个功能来检查zero
这样的
CREATE FUNCTION [dbo].[IsZero] (
@Number FLOAT,
)
RETURNS FLOAT
AS
BEGIN
IF (@Number = 0)
BEGIN
SET @Number = 1
END
RETURN (@Number)
END
答案 2 :(得分:0)
不是很优雅但会完成这项工作。
SELECT CASE WHEN (1 - (x2.sdp / 100) = 0 THEN NULL
WHEN (x1.dp / 100) = 0 THEN NULL
WHEN (x1.hup / (x1.dp / 100)) = 0 THEN NULL
WHEN (x1.hup / (x1.hup / (x1.dp / 100))) = 0 THEN NULL
ELSE (1 - (1 - (x1.hup / (x1.hup / (x1.dp / 100)))) / (1 - (x2.sdp / 100)))
END AS field
FROM yourtable
答案 3 :(得分:0)
合并为零并不是你正在寻找的神奇子弹。
试着简化你的问题;如果您42 / x
且x
为null
,则将其替换为零只会导致除法错误。
我不知道你在这种情况下应用的公式,但你缺少的主要是验证。在上面的示例中,如果x
等于0,我们就会遇到问题。
同样,在23 / (100 - x)
中,x
不能为100,所以您必须事先检查并相应处理情况。如果它是一个除数,则没有表达式可以导致0。
因此,尝试确定在处理之前应该观察哪些约束;例如,您的声明不能接受x1.dp
或x1.hup
的0,而x2.sdp
可以是100(1 - 100/100 = 0
,不对吗?)。如果其中一种情况发生,您可能会返回错误或其他内容。