nullif error entre división dividir dividing div cero avoid sql postgresql null aggregate-functions divide-by-zero

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.