En SQL, NULL n’est pas une valeur !

Je vois encore énormément d’erreurs à ce sujet, chez les développeurs avec qui je travaille et j’ai travaillé, mais aussi sur le forum.

Voici donc la démonstration que NULL en SQL n’est pas une valeur …


C’est très simple : exécutez la requête suivante :

1
2
3
IF NULL = NULL
  PRINT 'OK'
ELSE PRINT 'KO'

Vous pensez que l’on va obtenir OK … Donc vous pensez que NULL est une valeur et c’est faux : on obtiendra KO !
Vous pouvez faire l’expérience avec n’importe quel autre opérateur arithmétique (>, >=, <, <=, <>, !=) : vous obtiendrez toujours KO

Ceci prouve que NULL n’est pas une valeur : en SQL, c’est un marqueur qui signifie l’absence de valeur.
C’est d’ailleurs la raison pour laquelle en SQL, on écrit IS NULL dans un prédicat (WHERE ou JOIN), et non pas = NULL.
En revanche, dans un langage comme Java ou C#, null == null est effectivement vrai.

En effet, beaucoup de langages évaluent les expressions logiques suivant deux valeurs : true ou false.
Mais en SQL, un prédicat et évalué comme étant TRUE, FALSE ou UNKNOWN.

De la même façon, toute autre opération (NULL [operateur_arithmétique] [valeur]), peu importe le type de [valeur], retourne toujours NULL :

– NULL + 4
– NULL + ‘uneChaine’
– REPLACE(uneChaineNULL, ‘qqch’, ‘_qqch’)

Enfin, NULL est traité différemment par les différents opérateurs que l’implémentation SQL Server de SQL propose :

– Les filtres de requête (ON d’une jointure, WHERE (et AND qui suivent) et HAVING) évalueront NULL comme ne vérifiant pas le prédicat
– Une contrainte CHECK évaluera NULL comme vérifiant le prédicat
– Une contrainte UNIQUE prend NULL comme une valeur, ce qui est totalement faux
– Une opération avec les opérateurs d’ensembles UNION, EXCEPT et INTERSECT traite NULL comme une valeur, ce qui est également faux
– GROUP BY groupe tous les NULL dans un groupe distinct
– ORDER BY trie le NULL ensemble
– La fonction COUNT() tient compte de NULL
– Les autres fonctions d’agrégation n’en tiennent pas compte

Attention à NULL ;)

ElSüket

Une réflexion au sujet de « En SQL, NULL n’est pas une valeur ! »

  1. Il faut noter que tout dépend de l’option SET ANSI_NULLS de la base de données.
    Si cette option est à OFF alors celà change tout !

    Exemple :

    1
    2
    3
    4
    5
    6
    <br />
    SET ANSI_NULLS OFF<br />
    <br />
    IF NULL = NULL <br />
      PRINT 'OK' <br />
    ELSE PRINT 'KO'<br />

    Donne bien comme résultat : OK

Laisser un commentaire