Probleem:
U wilt deling uitvoeren in uw SQL-query, maar de noemer is een uitdrukking die nul kan zijn. De database geeft een foutmelding wanneer de noemer in feite nul is.
Voorbeeld:
Onze database heeft een tabel met de naam investor_data
met gegevens in de volgende kolommen:id
, investor_year
, price_per_share
, income
, en expenses
.
id | investor_year | price_per_share | inkomen | kosten |
---|---|---|---|---|
1 | 2016 | 20 | 3200 | 2300 |
2 | 2017 | 130 | 2000 | 2000 |
3 | 2018 | 40 | 200 | 100 |
4 | 2019 | 15 | 5900 | 4900 |
Laten we de prijs per aandeel delen door het verschil tussen inkomsten en uitgaven om de P/E-ratio (koers-winstverhouding) voor elk jaar te bepalen. Merk op dat er gevallen zijn waarin inkomsten gelijk zijn aan uitgaven, zodat hun verschil nul zal zijn. We moeten dus een manier vinden om deling door nul te vermijden.
Oplossing:
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
Deze query retourneert de K/W-ratio voor elk jaar zoals beschreven in de probleemstelling:
investor_year | P_E_ratio |
---|---|
2016 | 0,0222 |
2017 | NULL |
2018 | 0.4000 |
2019 | 0.0150 |
Als het verschil tussen inkomsten en uitgaven nul is (zoals het geval is voor 2017), wordt de NULLIF
functie verandert de nul in een NULL-waarde. Daarom geeft deling door nul je NULL in het resultaat.
Discussie:
Als je het delen door nul netjes wilt afhandelen, kun je de NULLIF
. gebruiken functie. NULLIF
heeft twee argumenten:de blijk van interesse en de waarde die u wilt overschrijven. Als het eerste argument gelijk is aan het tweede, dan NULLIF
geeft NULL terug; anders wordt het eerste argument geretourneerd.
U kunt deze functie gebruiken om een mogelijke deling door nul af te handelen door de noemer in een aanroep naar NULLIF
te plaatsen . Als in ons voorbeeld het verschil tussen inkomsten en uitgaven nul is, wordt deze waarde gewijzigd in NULL en is de noemer in de deling NULL, niet nul.
Oplossing 2:gebruik WHERE
Natuurlijk kun je in sommige situaties een eenvoudigere oplossing gebruiken:vermijd gewoon delen door nul door WHERE
te gebruiken met de vergelijkingsoperator <>. In ons voorbeeld kunnen we controleren of inkomsten-uitgaven anders zijn dan 0. Als dit het geval is, wordt de berekening geretourneerd.
SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
Merk op dat met de WHERE
oplossing, krijgt u minder rijen dan in de investor_date
tafel. De rijen waar inkomsten en uitgaven gelijk zijn, worden niet weergegeven in het eindresultaat.