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.