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.