Éviter la division par zéro dans PostgreSQL
je voudrais effectuer la division dans une clause SELECT. Quand je joins quelques tables et utilise la fonction agrégée j'ai souvent soit des valeurs nulles ou zéro comme les diviseurs. Pour l'instant, je ne propose que cette méthode pour éviter la division par des valeurs nulles et nulles.
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
je me demande s'il y a une meilleure façon de faire ça?
5 réponses
Depuis count()
ne retourne jamais NULL
(contrairement aux autres fonctions agrégées), vous n'avez qu'à attraper le 0
cas (qui est le seul cas problématique de toute façon):
CASE count(column_name)
WHEN 0 THEN 1
ELSE count(column_name)
END
Citant le manuel sur les fonctions d'agrégation:
il est à noter que sauf pour
count
, ces fonctions renvoient une valeur nulle lorsqu'aucune ligne n'est sélectionnée.
vous pouvez utiliser la fonction NULLIF par exemple
something/NULLIF(column_name,0)
Si la valeur de column_name
0 - résultat de l'expression entière sera NULL
je me rends compte que c'est une vieille question, mais une autre solution serait d'utiliser le plus fonction:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
Remarque:
Ma préférence serait de retourner un NULL, comme dans la réponse D'Erwin et Yuriy, ou de résoudre cela logiquement en détectant la valeur est 0
avant l'opération de division, et de retour 0
. Autrement, les données peuvent être déformées en utilisant 1
.
Si vous souhaitez que le diviseur à 1 lorsque le nombre est zéro:
count(column_name) + 1 * (count(column_name) = 0)::integer
La distribution de true
integer
est 1.
une autre solution qui évite seulement la division par zéro, en changeant la division par 1
select column + (column = 0)::integer;