sql >> データベース >  >> RDS >> Database

SQLでゼロ除算を処理する方法

    問題:

    SQLクエリで除算を実行したいのですが、分母はゼロにすることができる式です。分母が実際にゼロの場合、データベースはエラーを出します。

    例:

    私たちのデータベースには、investor_data 次の列にデータがあります:idinvestor_yearprice_per_shareincome 、および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 テーブル。収入と支出が等しい行は、最終結果には表示されません。


    1. SQL Server:初心者向けの便利なヒント

    2. OracleとSQLServerのスペースの処理の違い

    3. OracleからPostgreSQLへ:PostgreSQLのANSI外部結合構文

    4. SQL自己結合