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
akhil
quelle
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
  );
Philᵀᴹ
quelle
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.

Lennart
quelle
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] 
m409
quelle