2017-10-10 5 views
1

je devenais une division par 0 erreur avec ce code:Redshift division par zéro Puzzler

CASE 
WHEN DENOMINATOR >= 0 
THEN SUM(INT1 * INT2/DENOMINATOR) 
ELSE 0 
END AS RATIO 

Cependant, lorsque je l'ai changé le code suivant, cela a fonctionné.

CASE 
WHEN DENOMINATOR >= 0 
THEN SUM(INT1) * INT2/DENOMINATOR 
ELSE 0 
END AS RATIO 

Quelqu'un peut-il m'aider à comprendre la raison pour que je puisse éviter cela dans le futur? BTW, le premier échantillon a travaillé dans Vertica. Je réalise que faire la somme de ce qui doit être additionné plutôt que de faire le calcul avant que la sommation soit une meilleure pratique de programmation. Cependant, je suis toujours curieux.

+1

'CASE WHEN DENOMINATOR> = 0' ... semble faux ... si vous essayez d'éviter une erreur de division par 0 ... ne voulez-vous pas dire'> '0 pas'> = 'ou juste '<>' 0 si vous voulez autoriser les négatifs? – xQbert

+0

Je suppose que les dénominateurs négatifs devraient être 0. donc l'autre si juste> pas> = – xQbert

+0

La question du nombre négatif est sans rapport avec la question. Le point DEMONIMATOR ne devrait pas être zéro. J'essaie de comprendre pourquoi on travaille et l'autre me donne une erreur. – cjremley

Répondre

3

Je pense que la meilleure façon d'éviter de division par zéro est d'utiliser nullif():

SUM(INT1 * INT2/NULLIF(DENOMINATOR, 0)) 

ou:

SUM(INT1) * INT2/NULLIF(DENOMINATOR, 0) 

Ce retour NULL, que je trouve plus sensible pour un diviser pour situation par zéro. Vous pouvez ajouter COALESCE() pour obtenir 0, si vous le souhaitez.

+0

Comment gérer les valeurs négatives de DENOMINATOR? –

+0

@JonScott. . . Vous auriez besoin d'un «CAS» pour les gérer. –