Error de PostgreSQL: division by zero
ERROR: division by zero
Alguna división (o módulo) en la consulta llegó a un denominador cero. A diferencia de algunas bases de datos y de la mayoría de entornos de coma flotante, PostgreSQL lanza un error en vez de devolver NULL o infinito — así que cualquier división cuyo denominador pueda ser cero necesita decir qué debería pasar.
Qué significa este error
El error aborta toda la sentencia (y la transacción), aunque solo una fila de millones tuviera el cero. Por eso típicamente aparece en agregaciones e informes: todo funciona hasta el primer día en que un grupo está vacío o un total es cero. La solución es casi siempre el mismo idiom, aplicado en el punto de la división.
Causas comunes
- Tasas y porcentajes donde el denominador viene de datos:
clicks / impressions,revenue / orders— bien hasta que aparece una fila con cero. - Cambio porcentual contra una base cero.
- Cero de un agregado o de COALESCE:
count(*) FILTER (...)oCOALESCE(x, 0)alimentando un denominador.
Cómo diagnosticarlo
Encuentra las divisiones en la consulta y pregunta qué denominador puede ser cero. Para ver las filas infractoras, selecciona la expresión del denominador con sus claves de agrupación y filtra por cero — las filas que vuelven son las que harán explotar la división.
Cómo solucionarlo
-- El idiom estándar: denominador cero → resultado NULL
SELECT clicks / NULLIF(impressions, 0) AS ctr FROM stats;
-- Si quieres 0 (u otro valor por defecto) en vez de NULL:
SELECT COALESCE(clicks / NULLIF(impressions, 0), 0) AS ctr FROM stats;
NULLIF(x, 0)convierte el cero en NULL, y la división por NULL produce NULL en vez de un error. Decide deliberadamente si NULL ("indefinido") o un valor por defecto es lo correcto para el informe.- Trampa adyacente ya que estás aquí: la división entera trunca —
1/2 = 0. Castea un lado (clicks::numeric / NULLIF(impressions, 0)) cuando quieras fracciones.
