Vous n'êtes pas identifié(e).
Pages : 1
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
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.
Julien.
https://rjuju.github.io/
En ligne
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
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;
Julien.
https://rjuju.github.io/
En ligne
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
Il n'est calculé qu'une fois.
Guillaume.
Hors ligne
Pages : 1