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.