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

MySQLでゼロ除算を回避する方法

    問題:

    ゼロ除算エラーを回避したい。

    例:

    私たちのデータベースには、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の行 ゼロに等しい値が結果セットから欠落しています。


    1. MariaDBでのMONTHNAME()のしくみ

    2. Oracle ForUserSecurityでのプロファイルの作成

    3. SQL Serverの対象インデックスと対象クエリとは何ですか?

    4. Oracleでシーケンスをリセットするにはどうすればよいですか?