問題:
ゼロ除算エラーを回避したい。
例:
私たちのデータベースには、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の行 ゼロに等しい値が結果セットから欠落しています。