避免在计算列中除以零错误


8

您如何避免下表中的被零除错误?

CREATE TABLE [dbo].[TblDivision]
(
    [Numerator] int NOT NULL,
    [Denominator] int NOT NULL,
    [Result] AS (Numerator/ Denominator)
)
GO
Insert into (Numerator, Denominator) TblDivision values (3,0)
GO

1
如果分母为零无效,则可以在该列上添加检查约束。但这并不能回答问题,因为它只会导致更有意义的错误(更接近问题的根源),而不是完全避免错误。
David Spillett

您打算在这里使用整数除法吗?
马丁·史密斯

您是否考虑过不允许该列中的值为0?通常,我所看到的是将存储过程用于客户端应用程序,而不是普通的SQL。

Answers:


12

只需添加一个特殊情况以除以0:

CREATE TABLE [dbo].[TblDivision]
  (
  [Numerator] int NOT NULL,
  [Denominator] int NOT NULL,
  [Result] AS case when Denominator=0 then 0 else (Numerator/ Denominator) end
  );

4
或许返回NULL,而不是0,如果空值不适合代码读取列一个问题,因为除以零的结果是不是真的0,除非分子为0
大卫Spillett

3
是的,说实话,作为OP的练习留给了。避免错误已回答:)
Philᵀᴹ

10

类似于@Phil的解决方案:

CREATE TABLE dbo.TblDivision
(    Numerator int NOT NULL
,    Denominator int NOT NULL
,    Result AS Numerator / nullif(Denominator,0)
);

如果分母为0,则通过nullif映射为null。由于除以null的任何内容均为null,因此在这种情况下,结果将变为null。


当然,这是最干净的解决方案。我会接受这一点。
Christiaan Westerbeek

-2
case 
 when Denominator=0 then 0 
 else Numerator/ Denominator 
end as [Result] 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.