問題:
ゼロ除算エラーを回避したい。
例:
私たちのデータベースには、numbers
id
列にデータがあります 、number_a
、およびnumber_b
。
id | number_a | number_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
number_a
を分割してみましょう number_b
による 新しい列divided
でテーブルを表示します 、分割の結果。
ソリューション1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
ソリューション2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
結果は次のとおりです。
id | number_a | number_b | 分割 |
---|---|---|---|
1 | 4 | 0 | NULL |
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0.1250 |
4 | -67 | 0 | NULL |
5 | 23 | 55 | 0.4182 |
6 | -8 | -4 | 2.0000 |
ソリューション3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
結果は次のとおりです。
id | number_a | number_b | 分割 |
---|---|---|---|
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0.1250 |
5 | 23 | 55 | 0.4182 |
6 | -8 | -4 | 2.0000 |
ディスカッション:
最初の解決策は、NULLIF()
を使用します 関数。引数として2つの数値を取ります。最初の引数が他の引数と等しい場合、関数はNULL
を返します 結果として。 number_b
の場合 がゼロに等しい場合、除数はNULL
です。 、および除算の結果はNULL
です。 。
2番目のソリューションは、CASE
を使用します 声明。 WHEN
の後の条件の場合 キーワードがtrueです(この場合、条件はnumber_b = 0
です。 )、NULLが返されるように指定します。それ以外の場合、分割は通常どおりに行われます。
3番目のソリューションは、単にWHERE
を使用します number_b
の行を除外する条件 ゼロです。 number_b
の行 ゼロに等しい値が結果セットから欠落しています。