Problem:
Sie möchten den Division-durch-Null-Fehler vermeiden.
Beispiel:
Unsere Datenbank hat eine Tabelle namens numbers mit Daten in den Spalten id , number_a , und number_b .
| id | Nummer_a | Zahl_b |
|---|---|---|
| 1 | 4 | 0 |
| 2 | 57 | -5 |
| 3 | -7 | 56 |
| 4 | -67 | 0 |
| 5 | 23 | 55 |
| 6 | -8 | -4 |
Teilen wir number_a von number_b und zeige die Tabelle mit einer neuen Spalte, divided , mit dem Ergebnis der Division.
Lösung 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Lösung 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Das Ergebnis ist:
| id | Nummer_a | Zahl_b | geteilt |
|---|---|---|---|
| 1 | 4 | 0 | NULL |
| 2 | 57 | -5 | -11.4000 |
| 3 | -7 | 56 | -0,1250 |
| 4 | -67 | 0 | NULL |
| 5 | 23 | 55 | 0,4182 |
| 6 | -8 | -4 | 2.0000 |
Lösung 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Das Ergebnis ist:
| id | Nummer_a | Zahl_b | geteilt |
|---|---|---|---|
| 2 | 57 | -5 | -11.4000 |
| 3 | -7 | 56 | -0,1250 |
| 5 | 23 | 55 | 0,4182 |
| 6 | -8 | -4 | 2.0000 |
Diskussion:
Die erste Lösung verwendet NULLIF() Funktion, die zwei Zahlen als Argumente akzeptiert. Wenn das erste Argument gleich dem anderen Argument ist, gibt die Funktion NULL zurück infolge. Wenn number_b gleich Null ist, ist der Divisor NULL , und das Ergebnis der Division ist NULL .
Die zweite Lösung verwendet den CASE Erklärung. Wenn die Bedingung nach dem WHEN Schlüsselwort ist wahr (in unserem Fall ist die Bedingung number_b = 0). ), geben wir an, dass NULL zurückgegeben wird. Ansonsten erfolgt die Teilung wie gewohnt.
Die dritte Lösung verwendet einfach das WHERE Bedingung, um die Zeilen herauszufiltern, in denen number_b ist Null. Die Zeilen mit number_b gleich Null fehlen in der Ergebnismenge.