Vous n'êtes pas identifié(e).

#1 10/07/2015 14:11:11

guk92
Membre

Meilleur façon de gérer NULL divisé par NULL

Bonjour,



Lorsqu'on effectue une opération entre 2 NULL comme ici :

SELECT NULL / NULL;

ou

SELECT NULL + NULL;

... cela lance une exception de type 42725 ambiguous_function.


Selon vous, quelle est le meilleur moyen de gérer une division entre deux champs a et b, sachant que a et b peuvent être NULL, et b peut valoir 0 (donc 22012 division_by_zero).

J'ai pensé à ceci :

SELECT 
    field,
    CASE WHEN SUM(b) IS NULL OR SUM(b) = 0 THEN NULL ELSE SUM(a) / SUM(b) END 
FROM ma_table
GROUP BY field;

1. Qu'en pensez-vous ?
2. Est-ce que le fait d'utiliser SUM(b) 3 fois dans cette requête fait que le SGBD calcul 3 fois ce champs, ou est-t-il suffisamment "intelligent" pour ne le calculer qu'une seule fois ?



Merci, cordialement,

Hors ligne

#2 10/07/2015 14:44:46

rjuju
Administrateur

Re : Meilleur façon de gérer NULL divisé par NULL

Cela ne renvoie cette erreur que si les champs NULL sont de type inconnus.


# SELECT NULL::bigint / NULL::bigint;
 ?column? 
----------
   <NULL>

Si vous utilisez les champs de votre table, cela ne devrait pas poser de soucis. La seule raison de faire un cas spécifique c'est si vous voulez autre chose que le comportement standard, par exemple diviser par 1 plutôt que renvoyer NULL.

Hors ligne

#3 10/07/2015 19:00:49

guk92
Membre

Re : Meilleur façon de gérer NULL divisé par NULL

Merci pour ton retour Julien,

Je n'ai pas compris cette phrase : "La seule raison de faire un cas spécifique c'est si vous voulez autre chose que le comportement standard, par exemple diviser par 1 plutôt que renvoyer NULL.". Est-ce que c'était une réponse pour question 2. ?

Hors ligne

#4 15/07/2015 09:08:57

rjuju
Administrateur

Re : Meilleur façon de gérer NULL divisé par NULL

C'était une réponse à la question 1. Le comportement par défaut fait exactement ce que fait votre requête en exemple, à l'exception du cas de la division par 0. Donc, je pense que cette requête devrait suffire :


SELECT field, sum(a) / CASE WHEN sum(b) = 0 THEN NULL ELSE sum(b) END FROM ma_table GROUP BY field;

Hors ligne

#5 20/07/2015 16:49:38

guk92
Membre

Re : Meilleur façon de gérer NULL divisé par NULL

D'accord,


Une version plus courte serait plus maintenable alors : SELECT field, sum(a) / NULLIF(sum(b),  0) FROM ma_table GROUP BY field;
Et sinon pour la question 2 des idées ?


Cordialement,

Hors ligne

#6 20/07/2015 19:46:42

gleu
Administrateur

Re : Meilleur façon de gérer NULL divisé par NULL

Il n'est calculé qu'une fois.


Guillaume.

Hors ligne

Pied de page des forums