web-dev-qa-db-ja.com

SQLのゼロ除算エラーを防ぐ簡単な方法

を引き起こすために使用されるSQLクエリがあります

ゼロ除算例外

これを防ぐために、CASEステートメントでラップしました。これを行う簡単な方法はありますか?

これが私のコードです:

Percentage =  CASE WHEN AttTotal <> 0 THEN (ClubTotal/AttTotal) * 100 ELSE 0 END
12
Denys Wessels

より良い方法は、次のように [〜#〜] nullif [〜#〜] を使用することです。

Percentage =  100 * ClubTotal / NULLIF(AttTotal, 0)
39
Tom Chantler

場合によっては値を返す必要があるため、NULLIFビットを異なる方法で使用しています。通常、ゼロ除算エラーがある場合は0を返す必要があります。その場合、式全体をISNULLでラップします。だから:

Percentage =  ISNULL(100 * ClubTotal / NULLIF(AttTotal, 0), 0)

内側の部分はNULLに評価され、ISNULLは0に置き換えられます。

7
PiotrWolkowski
Percentage =  IsNull(ClubTotal/NullIf(AttTotal, 0) * 100, 0)
5
i-one

私の意見では、CASEステートメントはまさにその方法です。何かを計算するのではなく、AttTotalがゼロの場合に返す値を指定します。 0の0が100%の場合、別のケースブランチを追加することもできます。

ちょっとした注意:AttTotalがゼロでClubTotalがゼロより大きい場合、0を返しません。 NULLの方が適切な場合があります。または、AttTotalがゼロの場合に「No att。total」を含む数字(例、10.5%)ではなく、文字列(例、「10.50%」)を作成します。

PercentageString :=
  CASE
    WHEN AttTotal = 0 AND ClubTotal = 0 then '100%'
    WHEN AttTotal = 0 AND ClubTotal <> 0 THEN 'No att. total'
    ELSE to_char(ClubTotal / AttTotal * 100) || '%'
  END;
1

ゼロ除算問題を処理するために私が見つけた解決策は、状況を処理するために呼び出すことができる関数を作成することです。これが私が書いた簡単な関数です。

Create Function fnRatio(@Numerator decimal(10,2),@Demoninator decimal(10,2))

Returns decimal(10,2)

Begin

Return

Case 

      When @Demoninator = 0 then 0.00 



      When @Demoninator Is Null then Null



Else

      @Numerator/@Demoninator

End 

終わり

よろしく

ジェイソン

0
Jason