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

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
  );

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.


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] 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.