[High-Level] Gestion des nulls sans passer par NVL

Fermé
Beluzzo Messages postés 13 Date d'inscription jeudi 13 octobre 2005 Statut Membre Dernière intervention 3 juin 2013 - 3 juin 2013 à 15:45
jee pee Messages postés 39763 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 mai 2024 - 3 juin 2013 à 16:35
Bonjour à tous,

Dans le cadre de mon boulot, je suis amené à devoir comparer des attributs (jointure ou historisation SCD2) pouvant contenir la valeur null.

Certaines requêtes pouvants être relativement volumineuses, on a rapidement écarté la solution d'inclure un "or is/not is null"

Exemple (simple):

Je dois comparer C1 et C2 et c'est 2 champs peuvent être nulls.

... Where C1 = C2 or (C1 is null and C2 is null)

La seconde solution testée a été d'utiliser la fonction NVL qui permet de remplacer les nulls par une valeur afin d'effectuer des comparaisons.

Le problème dans ce cas de figure c'est que la valeur de remplacement peut-elle être significative.

Exemple :

Numérique => NVL(C1,0) = NVL(C2,0)
Caractère => NVL(C1, ' ') = NVL(C2,' ')

Cependant le '0' ou le ' ' peuvent représenter quelque chose ce qui créé des conflits ou empêche de tenir compte de certains changements dans le cadre d'une historisation.

Exemple :

Si C1 (numérique) passe de null à 0, il est impossible de déterminer qu'il y a eu un changement car NVL(C1,0) ramène dans les 2 cas 0.

La 3ème et dernières solution a été d'utiliser la fonction :

[I]DBMS_UTILITY.get_hash_value (C1, 1, POWER (2, 16) - 1)/I

Cette fonction à la base prévue pour du cryptage, permet d'attribuer une valeur numérique à tout valeur rencontrée (y compris les nulls). Je pensais tenir-là la bonne solution mais j'ai vite déschanté lorsque je me suis rendu compte que lors de requêtes assez importantes (requêtes imbriquées, not exist,...) on arrivait avec un temps d'exécution irréaliste (pour les plus connaisseur on arrivait via un plan d'exécution à 41.000.000.000...).

Je sais que ma question est relativement "high-level" mais j'espère quand-même que certains experts pourraient venir apporter leurs contributions...

Merci d'avance
A voir également:

1 réponse

jee pee Messages postés 39763 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 22 mai 2024 9 196
3 juin 2013 à 16:35
Salut,

Il existe d'autres fonctions pour gérer les NULL : DECODE, NVL2, COALESCE, NULLIF, LNNVL, SYS_OP_MAP_NONNULL

Dans ton cas la dernière permet de tester un champ NULL comme un champ ordinaire :

WHERE SYS_OP_MAP_NONNULL(C1) = SYS_OP_MAP_NONNULL(C2);

cdlt
0