Base de données -Oracle et la magie d'être NULL
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
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
Un point à prendre en considération est qu'une opération arithmétique comportant une valeur NULL donnera un résultat NULL, donc attention !
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.
blog comments powered by Disqus
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)
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