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

Come gestire la divisione per zero in SQL

Problema:

Si desidera eseguire la divisione nella query SQL, ma il denominatore è un'espressione che può essere zero. Il database ti darà un errore quando il denominatore è in effetti zero.

Esempio:

Il nostro database ha una tabella denominata investor_data con i dati nelle seguenti colonne:id , investor_year , price_per_share , income e expenses .

id anno_investitore prezzo_per_azione reddito spese
1 2016 20 3200 2300
2 2017 130 2000 2000
3 2018 40 200 100
4 2019 15 5900 4900

Dividiamo il prezzo per azione per la differenza tra entrate e spese per determinare il rapporto P/E (rapporto prezzo-guadagno) per ogni anno. Si noti che ci sono casi in cui il reddito è uguale alle spese, quindi la loro differenza sarà zero. Quindi, dobbiamo trovare un modo per evitare la divisione per zero.

Soluzione:

SELECT investor_year,
  price_per_share/NULLIF(income-expenses, 0)  AS P_E_ratio
FROM investor data;

Questa query restituisce il rapporto P/E per ogni anno come descritto nell'istruzione del problema:

anno_investitore P_E_ratio
2016 0.0222
2017 NULL
2018 0,4000
2019 0.0150

Se la differenza tra entrate e spese è zero (come nel caso del 2017), il NULLIF la funzione cambia lo zero in un valore NULL. Pertanto, la divisione per zero ti dà NULL nel risultato.

Discussione:

Se desideri gestire la divisione per zero con grazia, puoi utilizzare il NULLIF funzione. NULLIF accetta due argomenti:l'espressione di interesse e il valore che si desidera sovrascrivere. Se il primo argomento è uguale al secondo, allora NULLIF restituisce NULL; in caso contrario, restituisce il primo argomento.

Puoi usare questa funzione per gestire una potenziale divisione per zero avvolgendo il denominatore in una chiamata a NULLIF . Nel nostro esempio, se la differenza tra entrate e spese è zero, questo valore verrà modificato in NULL e il denominatore nella divisione sarà NULL, non zero.

Soluzione 2:usa WHERE

Naturalmente, in alcune situazioni, puoi usare una soluzione più semplice:evita semplicemente la divisione per zero usando WHERE con l'operatore di confronto <>. Nel nostro esempio, potremmo verificare se le entrate-spese sono diverse da 0. Se lo è, il calcolo verrà restituito.

SELECT investor_year,
  price_per_share/(income-expenses) AS P_E_ratio
FROM investor data
WHERE (income-expenses) <> 0 ;

Nota che con il WHERE soluzione, otterrai meno righe rispetto a investor_date tavolo. Le righe in cui entrate e spese sono uguali non verranno mostrate nel risultato finale.