Comment éviter une division par 0 (zéro) en SQL

closeCet article a été publié il y a 1 an 9 mois 15 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Comme tout le monde le sait la division par 0 (zéro) est une opération illégale qui renvoie donc une exception et empêche l’exécution des instructions qui suivent dans un programme informatique.

Cet article est un pense bête qui sera utile la prochaine fois que vous êtes confrontés à ce problème pour ne pas passer une demi-journée à trouver une solution.

Prenons l’exemple d’une requête SQL simple qui retourne la liste des participants à une compétition et affiche cette liste du plus rapide au moins rapide.

La requête devrait ressembler à

SELECT nom FROM COMPETITION 
ORDER BY distance/temps

Dans le cas ou un seul des enregistrements présent dans cette base de donnée a une valeur de 0 (zéro) dans le champ « temps » l’erreur suivante est renvoyée et l’exécution de la procédure stoppé.

Divide BY zero error encountered.

Pour pallier cette erreur nous allons utiliser la fonction SQL « NullIF »
Notre requête deviendra donc

SELECT nom FROM COMPETITION 
ORDER BY distance/(NULLIF(temps,0))

Si temps a pour valeur 0 (zéro), la fonction NULLIF substitue cette valeur par NULL et nous ne sommes donc plus face à un problème de division par zéro (à).

Pour information il existe la commande IFNULL qui fait exactement le contraire de NULLIF.

NULLIF(ColumnName, ValueToCompare) : retourne NULL si ColumnName = ValueToCompare

IFNULL(ColumnName, NewValue) : remplace ColumnName par NewValue si ColumnName est NULL

Trackback URL

,

3 Comments on "Comment éviter une division par 0 (zéro) en SQL"

  1. Jonathan
    06/08/2010 at 9 h 12 min Permalink

    Sympa cette fonction!
    C’est dispo sous tous les SGBD? (j’ai googlé vite fait, et j’ai vu que la fonction existe sous MySQL).

  2. Jérôme
    06/08/2010 at 13 h 12 min Permalink

    J’ai testé sous MySQL et MSSQL/T-SQL, la fonction existe et je n’ai pas testé mais elle existe aussi en Oracle/PLSQL.

  3. Antoine Windal
    10/03/2011 at 16 h 08 min Permalink

    très utile, merci

Hi Stranger, leave a comment:

ALLOWED XHTML TAGS:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Subscribe to Comments
Get Adobe Flash playerPlugin by wpburn.com wordpress themes