Problème :
Vous souhaitez éviter l'erreur de division par zéro.
Exemple :
Notre base de données a une table nommée numbers avec des données dans les colonnes id , number_a , et number_b .
| identifiant | numéro_a | number_b |
|---|---|---|
| 1 | 4 | 0 |
| 2 | 57 | -5 |
| 3 | -7 | 56 |
| 4 | -67 | 0 |
| 5 | 23 | 55 |
| 6 | -8 | -4 |
Divisons number_a par number_b et affichez le tableau avec une nouvelle colonne, divided , avec le résultat de la division.
Solution 1 :
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Solution 2 :
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Le résultat est :
| identifiant | numéro_a | nombre_b | divisé |
|---|---|---|---|
| 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 |
Solution 3 :
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Le résultat est :
| identifiant | numéro_a | number_b | divisé |
|---|---|---|---|
| 2 | 57 | -5 | -11.4000 |
| 3 | -7 | 56 | -0.1250 |
| 5 | 23 | 55 | 0.4182 |
| 6 | -8 | -4 | 2.0000 |
Discussion :
La première solution utilise le NULLIF() fonction, qui prend deux nombres comme arguments. Lorsque le premier argument est égal à l'autre argument, la fonction renvoie NULL par conséquent. Si number_b est égal à zéro, le diviseur est NULL , et le résultat de la division est NULL .
La deuxième solution utilise le CASE déclaration. Si la condition après le WHEN mot clé est vrai (dans notre cas, la condition est number_b = 0 ), nous spécifions que NULL doit être retourné. Sinon, la division se déroule comme d'habitude.
La troisième solution utilise simplement le WHERE condition pour filtrer les lignes où number_b est zéro. Les lignes avec number_b égaux à zéro manquent dans le jeu de résultats.