sql >> Database >  >> RDS >> Database

Hoe om te gaan met delen door nul in SQL?

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.


  1. TIMESTAMP() Voorbeelden – MySQL

  2. Oracle naar PostgreSQL — Cursors en algemene tabeluitdrukkingen

  3. Hoe alle landinstellingen in MariaDB te tonen

  4. Hoe UNPIVOT in Access te simuleren?