É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?

37
demandé sur A-B-B 2013-07-16 19:56:05

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.

26
répondu Erwin Brandstetter 2015-07-08 16:05:48

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

115
répondu Yuriy Galanter 2013-07-16 15:59:56

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.

16
répondu vol7ron 2014-10-23 17:19:03

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 trueinteger est 1.

1
répondu Clodoaldo Neto 2013-07-16 16:14:13

une autre solution qui évite seulement la division par zéro, en changeant la division par 1

select column + (column = 0)::integer;
0
répondu Manvel 2018-05-15 21:02:52