Errore PostgreSQL: division by zero
ERROR: division by zero
Una divisione (o un modulo) nella query ha incontrato un denominatore zero. A differenza di alcuni database e della maggior parte degli ambienti in virgola mobile, PostgreSQL solleva un errore invece di restituire NULL o infinito — quindi ogni divisione il cui denominatore può essere zero deve dire cosa dovrebbe succedere.
Cosa significa questo errore
L'errore interrompe l'intero statement (e la transazione), anche se una sola riga su milioni aveva lo zero. Ecco perché tipicamente compare in aggregazioni e report: tutto funziona fino al primo giorno in cui un gruppo è vuoto o un totale è zero. La soluzione è quasi sempre lo stesso idioma, applicato nel punto della divisione.
Cause comuni
- Tassi e percentuali in cui il denominatore viene dai dati:
clicks / impressions,revenue / orders— vanno bene finché non compare una riga a zero. - Variazione percentuale rispetto a una base zero.
- Zero da un aggregato o COALESCE:
count(*) FILTER (...)oCOALESCE(x, 0)che alimenta un denominatore.
Come diagnosticarlo
Trova le divisioni nella query e chiediti quale denominatore può essere zero. Per vedere le righe colpevoli, seleziona l'espressione del denominatore con le sue chiavi di raggruppamento e filtra per zero — le righe che tornano sono quelle che faranno esplodere la divisione.
Come risolverlo
-- L'idioma standard: denominatore zero → risultato NULL
SELECT clicks / NULLIF(impressions, 0) AS ctr FROM stats;
-- Se vuoi 0 (o altro default) invece di NULL:
SELECT COALESCE(clicks / NULLIF(impressions, 0), 0) AS ctr FROM stats;
NULLIF(x, 0)trasforma lo zero in NULL, e la divisione per NULL produce NULL invece di un errore. Decidi deliberatamente se NULL ("indefinito") o un default sia giusto per il report.- Trappola adiacente già che ci sei: la divisione tra interi tronca —
1/2 = 0. Fai il cast di un lato (clicks::numeric / NULLIF(impressions, 0)) quando vuoi le frazioni.
