Problem:
Du vill undvika division-med-noll-felet.
Exempel:
Vår databas har en tabell som heter numbers med data i kolumnerna id , number_a och number_b .
| id | number_a | nummer_b |
|---|---|---|
| 1 | 4 | 0 |
| 2 | 57 | -5 |
| 3 | -7 | 56 |
| 4 | -67 | 0 |
| 5 | 23 | 55 |
| 6 | -8 | -4 |
Låt oss dela number_a av number_b och visa tabellen med en ny kolumn, divided , med resultatet av divisionen.
Lösning 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Lösning 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Resultatet är:
| id | number_a | nummer_b | delad |
|---|---|---|---|
| 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ösning 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Resultatet är:
| id | number_a | nummer_b | delad |
|---|---|---|---|
| 2 | 57 | -5 | -11.4000 |
| 3 | -7 | 56 | -0,1250 |
| 5 | 23 | 55 | 0,4182 |
| 6 | -8 | -4 | 2 0000 |
Diskussion:
Den första lösningen använder NULLIF() funktion, som tar två tal som argument. När det första argumentet är lika med det andra argumentet returnerar funktionen NULL som ett resultat. Om number_b är lika med noll, är divisorn NULL , och resultatet av divisionen är NULL .
Den andra lösningen använder CASE påstående. Om villkoret efter WHEN nyckelordet är sant (i vårt fall är villkoret number_b = 0 ), anger vi att NULL returneras. Annars sker uppdelningen som vanligt.
Den tredje lösningen använder helt enkelt WHERE villkor för att filtrera bort raderna där number_b är noll. Raderna med number_b lika med noll saknas i resultatuppsättningen.