Problème :
Vous souhaitez effectuer une division dans votre requête SQL, mais le dénominateur est une expression qui peut être nulle. La base de données vous donnera une erreur lorsque le dénominateur est en fait zéro.
Exemple :
Notre base de données a une table nommée investor_data
avec des données dans les colonnes suivantes :id
, investor_year
, price_per_share
, income
, et expenses
.
identifiant | investor_year | price_per_share | revenu | dépenses |
---|---|---|---|---|
1 | 2016 | 20 | 3200 | 2300 |
2 | 2017 | 130 | 2000 | 2000 |
3 | 2018 | 40 | 200 | 100 |
4 | 2019 | 15 | 5900 | 4900 |
Divisons le prix par action par la différence entre les revenus et les dépenses pour déterminer le ratio P/E (ratio cours/bénéfice) pour chaque année. Notez qu'il y a des cas où le revenu est égal aux dépenses, donc leur différence sera nulle. Ainsi, nous devons trouver un moyen d'éviter la division par zéro.
Solution :
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
Cette requête renvoie le ratio P/E pour chaque année, comme décrit dans l'énoncé du problème :
investor_year | P_E_ratio |
---|---|
2016 | 0.0222 |
2017 | NULL |
2018 | 0.4000 |
2019 | 0.0150 |
Si la différence entre les revenus et les dépenses est nulle (comme c'est le cas pour 2017), le NULLIF
La fonction change le zéro en une valeur NULL. Par conséquent, la division par zéro vous donne NULL dans le résultat.
Discussion :
Si vous souhaitez gérer la division par zéro avec élégance, vous pouvez utiliser le NULLIF
une fonction. NULLIF
prend deux arguments :l'expression d'intérêt et la valeur que vous souhaitez remplacer. Si le premier argument est égal au second, alors NULLIF
renvoie NULL ; sinon, il renvoie le premier argument.
Vous pouvez utiliser cette fonction pour gérer une division potentielle par zéro en enveloppant le dénominateur dans un appel à NULLIF
. Dans notre exemple, si la différence entre les revenus et les dépenses est nulle, cette valeur sera remplacée par NULL et le dénominateur de la division sera NULL, et non zéro.
Solution 2 :utilisez WHERE
Bien sûr, dans certaines situations, vous pouvez utiliser une solution plus simple :évitez simplement la division par zéro en utilisant WHERE
avec l'opérateur de comparaison <>. Dans notre exemple, nous pourrions vérifier si les revenus-dépenses sont différents de 0. Si c'est le cas, le calcul sera retourné.
SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
Notez qu'avec le WHERE
solution, vous obtiendrez moins de lignes qu'il n'y en a dans le investor_date
table. Les lignes où les revenus et les dépenses sont égaux ne seront pas affichées dans le résultat final.