sql >> Database teknologi >  >> RDS >> Database

Sådan håndteres dividere med nul i SQL

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.


  1. ClusterControl CMON HA for distribueret database høj tilgængelighed - del 2 (GUI-adgangsopsætning)

  2. Hvordan make_timestamp() virker i PostgreSQL

  3. PostgreSQL - hvordan gengiver man dato i forskellige tidszoner?

  4. Kompleks Postgres-forespørgsel