sql >> Databasteknik >  >> RDS >> Mysql

Hur man undviker att dividera med noll i MySQL

Problem:

Du vill undvika division-med-noll-felet.

Exempel:

Vår databas har en tabell som heter numbers med data i kolumnerna id , number_a och number_b .

id number_a nummer_b
1 4 0
2 57 -5
3 -7 56
4 -67 0
5 23 55
6 -8 -4

Låt oss dela number_a av number_b och visa tabellen med en ny kolumn, divided , med resultatet av divisionen.

Lösning 1:

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

Lösning 2:

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

Resultatet är:

id number_a nummer_b delad
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

Lösning 3:

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

Resultatet är:

id number_a nummer_b delad
2 57 -5 -11.4000
3 -7 56 -0,1250
5 23 55 0,4182
6 -8 -4 2 0000

Diskussion:

Den första lösningen använder NULLIF() funktion, som tar två tal som argument. När det första argumentet är lika med det andra argumentet returnerar funktionen NULL som ett resultat. Om number_b är lika med noll, är divisorn NULL , och resultatet av divisionen är NULL .

Den andra lösningen använder CASE påstående. Om villkoret efter WHEN nyckelordet är sant (i vårt fall är villkoret number_b = 0 ), anger vi att NULL returneras. Annars sker uppdelningen som vanligt.

Den tredje lösningen använder helt enkelt WHERE villkor för att filtrera bort raderna där number_b är noll. Raderna med number_b lika med noll saknas i resultatuppsättningen.


  1. JSON_QUERY() Exempel i SQL Server (T-SQL)

  2. Snabbtips – Snabba upp en långsam återställning från transaktionsloggen

  3. Hur skapar man en databas i SQL?

  4. Mer robusta kollationer med ICU-stöd i PostgreSQL 10