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.