Database
 sql >> Datenbank >  >> RDS >> Database

Umgang mit der Division durch Null in SQL

Problem:

Sie möchten in Ihrer SQL-Abfrage eine Division durchführen, aber der Nenner ist ein Ausdruck, der Null sein kann. Die Datenbank gibt Ihnen einen Fehler, wenn der Nenner tatsächlich Null ist.

Beispiel:

Unsere Datenbank hat eine Tabelle namens investor_data mit Daten in den folgenden Spalten:id , investor_year , price_per_share , income und expenses .

id Investor_Jahr Preis_pro_Aktie Einkommen Kosten
1 2016 20 3200 2300
2 2017 130 2000 2000
3 2018 40 200 100
4 2019 15 5900 4900

Teilen wir den Preis pro Aktie durch die Differenz zwischen Einnahmen und Ausgaben, um das KGV (Kurs-Gewinn-Verhältnis) für jedes Jahr zu ermitteln. Beachten Sie, dass es Fälle gibt, in denen Einnahmen gleich Ausgaben sind, sodass ihre Differenz Null ist. Daher müssen wir einen Weg finden, die Division durch Null zu vermeiden.

Lösung:

SELECT investor_year,
  price_per_share/NULLIF(income-expenses, 0)  AS P_E_ratio
FROM investor data;

Diese Abfrage gibt das KGV für jedes Jahr zurück, wie in der Problemstellung beschrieben:

investor_year P_E_ratio
2016 0,0222
2017 NULL
2018 0,4000
2019 0,0150

Wenn die Differenz zwischen Einnahmen und Ausgaben Null ist (wie im Fall von 2017), wird der NULLIF Funktion ändert die Null in einen NULL-Wert. Daher ergibt die Division durch Null das Ergebnis NULL.

Diskussion:

Wenn Sie die Division durch Null elegant handhaben möchten, können Sie den NULLIF verwenden Funktion. NULLIF akzeptiert zwei Argumente:die Interessenbekundung und den Wert, den Sie überschreiben möchten. Wenn das erste Argument gleich dem zweiten ist, dann NULLIF gibt NULL zurück; Andernfalls wird das erste Argument zurückgegeben.

Sie können diese Funktion verwenden, um eine potenzielle Division durch Null zu behandeln, indem Sie den Nenner in einen Aufruf von NULLIF einschließen . Wenn in unserem Beispiel die Differenz zwischen Einnahmen und Ausgaben Null ist, wird dieser Wert in NULL geändert, und der Nenner in der Division ist NULL und nicht Null.

Lösung 2:Verwenden Sie WHERE

Natürlich können Sie in manchen Situationen eine einfachere Lösung verwenden:Vermeiden Sie einfach die Division durch Null, indem Sie WHERE verwenden mit dem Vergleichsoperator <>. In unserem Beispiel könnten wir überprüfen, ob die Einnahmen-Ausgaben von 0 verschieden sind. Wenn dies der Fall ist, wird die Berechnung zurückgegeben.

SELECT investor_year,
  price_per_share/(income-expenses) AS P_E_ratio
FROM investor data
WHERE (income-expenses) <> 0 ;

Beachten Sie das mit dem WHERE Lösung erhalten Sie weniger Zeilen als im investor_date Tisch. Die Zeilen, in denen Einnahmen und Ausgaben gleich sind, werden im Endergebnis nicht angezeigt.