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

Beluzzo Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -  
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   -
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 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
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