問題:
SQLクエリで除算を実行したいのですが、分母はゼロにすることができる式です。分母が実際にゼロの場合、データベースはエラーを出します。
例:
私たちのデータベースには、investor_data
次の列にデータがあります:id
、investor_year
、price_per_share
、income
、およびexpenses
。
id | Investmentor_year | price_per_share | 収入 | 経費 |
---|---|---|---|---|
1 | 2016 | 20 | 3200 | 2300 |
2 | 2017 | 130 | 2000 | 2000 |
3 | 2018 | 40 | 200 | 100 |
4 | 2019 | 15 | 5900 | 4900 |
1株あたりの価格を収入と支出の差で割って、各年の株価収益率(株価収益率)を決定しましょう。収入が費用と等しい場合があることに注意してください。そのため、それらの差はゼロになります。したがって、ゼロによる除算を回避する方法を見つける必要があります。
解決策:
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
このクエリは、問題ステートメントで説明されているように、各年の株価収益率を返します。
Investmentor_year | P_E_ratio |
---|---|
2016 | 0.0222 |
2017 | NULL |
2018 | 0.4000 |
2019 | 0.0150 |
収入と支出の差がゼロの場合(2017年の場合のように)、NULLIF
関数はゼロをNULL値に変更します。したがって、ゼロで除算すると、結果がNULLになります。
ディスカッション:
ゼロ除算を適切に処理する場合は、NULLIF
を使用できます。 働き。 NULLIF
対象の式とオーバーライドする値の2つの引数を取ります。最初の引数が2番目の引数と等しい場合、NULLIF
NULLを返します。それ以外の場合は、最初の引数を返します。
この関数を使用して、NULLIF
の呼び出しで分母をラップすることにより、ゼロによる潜在的な除算を処理できます。 。この例では、収入と支出の差がゼロの場合、この値はNULLに変更され、部門の分母はゼロではなくNULLになります。
解決策2:WHERE
もちろん、状況によっては、より単純な解決策を使用することもできます。WHERE
を使用して、ゼロによる除算を回避するだけです。 比較演算子<>を使用します。この例では、income-expensesが0と異なるかどうかを確認できます。異なる場合は、計算が返されます。
SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
WHERE
を使用することに注意してください 解決策として、investor_date
テーブル。収入と支出が等しい行は、最終結果には表示されません。