sql >> Databáze >  >> RDS >> Mysql

Jak se vyhnout dělení nulou v MySQL

Problém:

Chtěli byste se vyhnout chybě dělení nulou.

Příklad:

Naše databáze má tabulku s názvem numbers s údaji ve sloupcích id , number_a a number_b .

id číslo_a číslo_b
1 4 0
2 57 -5
3 -7 56
4 -67 0
5 23 55
6 -8 -4

Rozdělme number_a podle number_b a zobrazit tabulku s novým sloupcem, divided , s výsledkem dělení.

Řešení 1:

SELECT
	*,
	number_a / NULLIF(number_b, 0) AS divided
FROM numbers;

Řešení 2:

SELECT
	*,
	CASE
WHEN number_b = 0
		THEN NULL
		ELSE number_a / number_b
	END AS divided
FROM numbers;

Výsledek je:

id číslo_a číslo_b rozděleno
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

Řešení 3:

SELECT
	*,
	number_a / number_b AS divided
FROM numbers
WHERE number_b != 0;

Výsledek je:

id číslo_a číslo_b rozděleno
2 57 -5 -11 4000
3 -7 56 -0,1250
5 23 55 0,4182
6 -8 -4 2 0000

Diskuse:

První řešení používá NULLIF() funkce, která má dvě čísla jako argumenty. Když je první argument roven druhému argumentu, funkce vrátí NULL jako výsledek. Pokud number_b je roven nule, dělitel je NULL a výsledek dělení je NULL .

Druhé řešení používá CASE prohlášení. Pokud je podmínka za WHEN klíčové slovo je true (v našem případě je podmínkou number_b = 0 ), určíme, že se má vrátit NULL. V opačném případě proběhne rozdělení jako obvykle.

Třetí řešení jednoduše používá WHERE podmínkou pro odfiltrování řádků, kde je number_b je nula. Řádky s number_b v sadě výsledků chybí nula.


  1. Proč dostanu PLS-00302:komponenta musí být deklarována, když existuje?

  2. ERROR 2003 (HY000):Nelze se připojit k serveru MySQL na '127.0.0.1' (111)

  3. Jak získat záznamy za posledních 30 minut v MS SQL?

  4. implodování seznamu pro použití v klauzuli python MySQLDB IN