Problem:
Du ønsker at udføre division i din SQL-forespørgsel, men nævneren er et udtryk, der kan være nul. Databasen vil give dig en fejl, når nævneren faktisk er nul.
Eksempel:
Vores database har en tabel med navnet investor_data
med data i følgende kolonner:id
, investor_year
, price_per_share
, income
, og expenses
.
id | investor_year | price_per_share | indkomst | udgifter |
---|---|---|---|---|
1 | 2016 | 20 | 3200 | 2300 |
2 | 2017 | 130 | 2000 | 2000 |
3 | 2018 | 40 | 200 | 100 |
4 | 2019 | 15 | 5900 | 4900 |
Lad os dividere prisen per aktie med forskellen mellem indtægter og udgifter for at bestemme P/E-forholdet (pris-indtjening) for hvert år. Bemærk, at der er tilfælde, hvor indkomst er lig med udgifter, så deres forskel vil være nul. Derfor er vi nødt til at finde en måde at undgå division med nul.
Løsning:
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
Denne forespørgsel returnerer P/E-forholdet for hvert år som beskrevet i problemformuleringen:
investor_year | P_E_ratio |
---|---|
2016 | 0,0222 |
2017 | NULL |
2018 | 0,4000 |
2019 | 0,0150 |
Hvis forskellen mellem indtægter og udgifter er nul (som det er tilfældet for 2017), er NULLIF
funktion ændrer nul til en NULL værdi. Derfor giver division med nul dig NULL i resultatet.
Diskussion:
Hvis du gerne vil håndtere division med nul elegant, kan du bruge NULLIF
fungere. NULLIF
tager to argumenter:interessetilkendegivelsen og den værdi, du vil tilsidesætte. Hvis det første argument er lig med det andet, så NULLIF
returnerer NULL; ellers returnerer det det første argument.
Du kan bruge denne funktion til at håndtere en potentiel division med nul ved at ombryde nævneren i et kald til NULLIF
. I vores eksempel, hvis forskellen mellem indtægter og udgifter er nul, vil denne værdi blive ændret til NULL, og nævneren i divisionen vil være NULL, ikke nul.
Løsning 2:Brug WHERE
Selvfølgelig kan du i nogle situationer bruge en enklere løsning:Bare undgå division med nul ved at bruge WHERE
med sammenligningsoperatoren <>. I vores eksempel kunne vi kontrollere, om indtægtsudgifter er anderledes end 0. Hvis det er, vil beregningen blive returneret.
SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
Bemærk det med WHERE
løsning, får du færre rækker, end der er i investor_date
bord. De rækker, hvor indtægter og udgifter er ens, vil ikke blive vist i det endelige resultat.