Menghindari kesalahan pembagian dengan nol di kolom yang dihitung

8

Bagaimana Anda menghindari pembagian dengan kesalahan nol pada tabel di bawah ini?

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
akhil
sumber
1
Jika tidak valid untuk Denominator menjadi nol, Anda bisa menambahkan batasan pemeriksaan pada kolom itu. Namun itu tidak menjawab pertanyaan karena hanya menghasilkan kesalahan yang lebih bermakna (lebih dekat ke sumber masalah) daripada menghindari kesalahan sepenuhnya.
David Spillett
Apakah Anda bermaksud menggunakan divisi integer di sini atau tidak?
Martin Smith
Sudahkah Anda dianggap tidak membiarkan 0 menjadi nilai di kolom itu? Biasanya yang saya lihat adalah sproc yang digunakan untuk aplikasi klien, bukan SQL biasa.

Jawaban:

12

Tambahkan saja case khusus untuk pembagian dengan 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
  );
Philᵀᴹ
sumber
4
Atau mungkin mengembalikan NULL daripada 0 jika NULL bukan masalah untuk membaca kode kolom itu, karena hasil bagi-oleh-nol tidak benar-benar 0 kecuali pembilangnya adalah 0.
David Spillett
3
Ya, dibiarkan sebagai latihan untuk OP, jujur ​​saja. Menghindari kesalahan telah dijawab :)
Philᵀᴹ
10

Mirip dengan solusi @ Phil:

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

Jika Denominator bernilai 0, ia dipetakan ke nol melalui nullif. Karena apa pun yang dibagi dengan nol adalah nol, hasilnya menjadi nol dalam kasus ini.

Lennart
sumber
Tentu ini adalah solusi terbersih. Saya akan menerima yang ini.
Christiaan Westerbeek
-2
case 
 when Denominator=0 then 0 
 else Numerator/ Denominator 
end as [Result] 
m409
sumber