Vermeiden einer Division durch Null Fehler in einer berechneten Spalte


8

Wie vermeiden Sie das Teilen durch Null in der folgenden Tabelle?

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
Wenn der Nenner für Null ungültig ist, können Sie dieser Spalte eine Prüfbedingung hinzufügen. Dies beantwortet die Frage jedoch nicht, da es nur zu einem aussagekräftigeren Fehler führt (näher an der Ursache des Problems), anstatt einen Fehler vollständig zu vermeiden.
David Spillett

Beabsichtigen Sie hier die Ganzzahldivision zu verwenden oder nicht?
Martin Smith

Haben Sie darüber nachgedacht, 0 nicht als Wert in dieser Spalte zuzulassen? Normalerweise habe ich gesehen, dass ein Sproc für Clientanwendungen verwendet wird und nicht für einfaches SQL.

Antworten:


12

Fügen Sie einfach einen Sonderfall für die Division durch 0 hinzu:

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
Oder geben Sie NULL statt 0 zurück, wenn NULL kein Problem für das Lesen dieser Spalte ist, da das Ergebnis der Division durch Null nicht wirklich 0 ist, es sei denn, der Zähler ist 0.
David Spillett

3
Ja, um ehrlich zu sein, als Übung für das OP. Das Vermeiden des Fehlers wurde beantwortet :)
Philᵀᴹ

10

Ähnlich wie bei @ Phils Lösung:

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

Wenn der Nenner 0 ist, wird er über nullif auf null abgebildet. Da alles, was durch null geteilt wird, null ist, wird das Ergebnis in diesem Fall null.


Dies ist natürlich die sauberste Lösung. Ich würde diesen akzeptieren.
Christiaan Westerbeek

-2
case 
 when Denominator=0 then 0 
 else Numerator/ Denominator 
end as [Result] 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.