Votre navigateur n'est pas à jour !

Merci de mettre à jour votre navigateur pour utiliser mon blog. Mettre à jour mon navigateur maintenant

×

Base de données - Oracle et la magie d'être NULL

Date de publication 8 déc. 2016
Les utilisateurs de la base de données Oracle ont déjà du se confronter au problème du NULL ! En effet cette SGBD gère d'une manière particulière les cas lorsque les valeurs sont considérées sans contenu.
Si un champ est NULL oracle n’est pas capable de le comparer à une autre chaine ou à elle même.

Quelques exemples
  • Un cas normal
    SELECT CASE WHEN 10 = NULL THEN 'Y' ELSE 'N' END AS CONTENT_IS_NULL FROM DUAL; # N (unknown)
  • Un cas étrange
    SELECT CASE WHEN NULL = NULL THEN 'Y' ELSE 'N' END AS CONTENT_IS_NULL FROM DUAL; # N (unknown)
Vous allez me dire que c'est un bug et qu'on est coincé. Mais en faite il faut utiliser IS_NULL
SELECT CASE WHEN NULL IS NULL THEN 'Y' ELSE 'N' END AS CONTENT_IS_NULL FROM DUAL; # Y

Attention Oracle ne recommande par de vérifier qu'une chaine vide et une valeur NULL sont égales. Sous certaines versions cela peut être vrai mais cela ne le sera surement plus dans le futur.
Sur la version de Oracle 12c, NULL est différent d'une chaine vide
SELECT CASE WHEN NULL = '' THEN 1 ELSE 0 END AS CONTENT_IS_NULL FROM DUAL # 0

Un point à prendre en considération est qu'une opération arithmétique comportant une valeur NULL donnera un résultat NULL, donc attention !
SELECT 10/2 + NULL FROM DUAL; # NULL

Une autre solution est d'utiliser la fonction NVL. Elle remplace le contenu de la variable par le 2eme paramètre si le 1er paramètre est NULL.
SELECT 10/NVL(NULL, 1) FROM DUAL; # 10
blog comments powered by Disqus