error - Evite la división por cero en PostgreSQL
error de división entre cero. sql (5)
Me gustaría realizar división en una cláusula SELECT. Cuando uní algunas tablas y uso la función agregada, a menudo tengo valores nulos o cero como divisores. Por ahora solo se me ocurrió este método de evitar la división por cero y valores nulos.
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
Me pregunto si hay una mejor manera de hacer esto.
Como count()
nunca devuelve NULL
(a diferencia de otras funciones de agregado), solo tiene que capturar el caso 0
(que es el único caso problemático de todos modos):
CASE count(column_name)
WHEN 0 THEN 1
ELSE count(column_name)
END
Citando el manual sobre funciones agregadas:
Se debe tener en cuenta que, a excepción del
count
, estas funciones devuelven un valor nulo cuando no se seleccionan filas.
Me doy cuenta de que esta es una vieja pregunta, pero otra solución sería hacer uso de la función más importante :
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
Nota: Mi preferencia sería devolver un NULL, como en la respuesta de Erwin y Yuriy, o resolver esto lógicamente detectando que el valor es 0
antes de la operación de división y devuelve 0
. De lo contrario, los datos pueden tergiversarse al usar 1
.
Otra solución que evita solo la división por cero, cambiando la división por 1
select column + (column = 0)::integer;
Puede usar la función NULLIF, por ejemplo
something/NULLIF(column_name,0)
Si el valor de column_name
es 0, el resultado de toda la expresión será NULL
Si quieres que el divisor sea 1 cuando el recuento es cero:
count(column_name) + 1 * (count(column_name) = 0)::integer
El elenco de true
a integer
es 1.