計算列でのゼロ除算エラーの回避


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、2016年

ここで整数除算を使用するつもりですか?
Martin Smith

その列の値を0にしないことを検討しましたか?通常、私が見たのは、単純なSQLではなく、クライアントアプリケーションに使用されているsprocです。

回答:


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
分子が0でない限り、NULLがその列を読み取るコードの問題ではない場合、または恐らくゼロによる除算の結果として、NULLではなく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] 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.