Tránh sai số chia cho số 0 trong cột được tính


8

Làm thế nào để bạn tránh chia cho lỗi không trong bảng dưới đây?

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
Nếu mẫu số không hợp lệ bằng 0, bạn có thể thêm ràng buộc kiểm tra trên cột đó. Điều đó không trả lời câu hỏi mặc dù nó chỉ dẫn đến một lỗi có ý nghĩa hơn (gần với nguồn gốc của vấn đề) hơn là tránh hoàn toàn một lỗi.
David Spillett

Bạn có ý định sử dụng phép chia số nguyên ở đây hay không?
Martin Smith

Bạn đã xem việc không cho phép 0 là một giá trị trong cột đó chưa? Thông thường những gì tôi đã thấy là một sproc đang được sử dụng cho các ứng dụng khách, thay vì SQL đơn giản.

Câu trả lời:


12

Chỉ cần thêm một trường hợp đặc biệt để chia cho 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
Hoặc có thể trả về NULL chứ không phải 0 nếu NULL không phải là vấn đề khi đọc mã đó, vì kết quả của phép chia không thực sự là 0 trừ khi tử số bằng 0.
David Spillett

3
Vâng, phải là một bài tập cho OP, thành thật mà nói. Tránh lỗi đã được trả lời :)
Phil 6/1/2016

10

Tương tự như giải pháp của @ Phil:

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

Nếu mẫu số là 0, nó được ánh xạ thành null thông qua nullif. Vì bất cứ điều gì chia cho null là null, kết quả sẽ trở thành null trong trường hợp này.


Tất nhiên đây là giải pháp sạch nhất. Tôi sẽ chấp nhận điều này.
Christiaan Westerbeek

-2
case 
 when Denominator=0 then 0 
 else Numerator/ Denominator 
end as [Result] 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.