sql >> Databasteknik >  >> RDS >> Database

Hur man hanterar dividera med noll i SQL

Problem:

Du vill utföra division i din SQL-fråga, men nämnaren är ett uttryck som kan vara noll. Databasen kommer att ge dig ett fel när nämnaren faktiskt är noll.

Exempel:

Vår databas har en tabell som heter investor_data med data i följande kolumner:id , investor_year , price_per_share , income och expenses .

id investor_year pris_per_andel inkomst kostnader
1 2016 20 3200 2300
2 2017 130 2000 2000
3 2018 40 200 100
4 2019 15 5900 4900

Låt oss dividera priset per aktie med skillnaden mellan intäkter och kostnader för att bestämma P/E-talet (pris-vinstkvot) för varje år. Observera att det finns fall då inkomster är lika med utgifter, så skillnaden blir noll. Därför måste vi hitta ett sätt att undvika division med noll.

Lösning:

SELECT investor_year,
  price_per_share/NULLIF(income-expenses, 0)  AS P_E_ratio
FROM investor data;

Den här frågan returnerar P/E-talet för varje år enligt beskrivningen i problemformuleringen:

investor_year P_E_ratio
2016 0,0222
2017 NULL
2018 0,4000
2019 0,0150

Om skillnaden mellan inkomster och kostnader är noll (som är fallet för 2017), är NULLIF funktionen ändrar noll till ett NULL-värde. Därför ger division med noll dig NULL i resultatet.

Diskussion:

Om du vill hantera division med noll snyggt kan du använda NULLIF fungera. NULLIF tar två argument:intresseanmälan och värdet du vill åsidosätta. Om det första argumentet är lika med det andra, då NULLIF returnerar NULL; annars returnerar den det första argumentet.

Du kan använda den här funktionen för att hantera en potentiell division med noll genom att slå in nämnaren i ett anrop till NULLIF . Om skillnaden mellan intäkter och kostnader i vårt exempel är noll, kommer detta värde att ändras till NULL, och nämnaren i divisionen blir NULL, inte noll.

Lösning 2:Använd WHERE

Naturligtvis, i vissa situationer kan du använda en enklare lösning:Undvik bara division med noll genom att använda WHERE med jämförelseoperatorn <>. I vårt exempel skulle vi kunna kontrollera om inkomstkostnaderna är annorlunda än 0. Om så är fallet kommer beräkningen att returneras.

SELECT investor_year,
  price_per_share/(income-expenses) AS P_E_ratio
FROM investor data
WHERE (income-expenses) <> 0 ;

Observera att med WHERE lösning, får du färre rader än det finns i investor_date tabell. Raderna där intäkter och kostnader är lika kommer inte att visas i slutresultatet.


  1. Kan jag använda en funktion för ett standardvärde i MySql?

  2. Bästa datatypen för att lagra pengar i MySQL

  3. Hur man får en lista över primärnyckelbegränsningar från alla databaser på SQL Server Instance - SQL Server / TSQL Tutorial Del 60

  4. Förstå molnbaserad SQL Server-prestandaövervakning