Database
 sql >> Base de données >  >> RDS >> Database

Comment gérer la division par zéro en SQL

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.