Pourquoi un null ne peut-il pas être égal à un null pour le bien d'une jointure?
Dites simplement à Oracle de le faire:
select *
from one t1
join two t2 on coalesce(t1.id, -1) = coalesce(t2.id, -1);
(Notez que dans SQL standard, vous pouvez utiliser t1.id is not distinct from t2.id
pour obtenir un opérateur d'égalité nul, mais Oracle ne le prend pas en charge)
Mais cela ne fonctionnera que si la valeur de remplacement (-1 dans l'exemple ci-dessus) n'apparaît pas réellement dans le tableau. Il peut être possible de trouver une telle valeur "magique" pour les nombres , mais ce sera très difficile pour les valeurs de caractère (en particulier parce qu'Oracle traite également une chaîne vide null
)
Plus: aucun index sur les id
colonnes ne sera utilisé (vous pouvez cependant définir un index basé sur une fonction avec l' coalesce()
expression).
Une autre option qui fonctionne pour tous les types, sans valeurs magiques:
on t1.id = t2.id or (t1.id is null and t2.id is null)
Mais la vraie question est: est -ce que cela a du sens?
Tenez compte des exemples de données suivants:
Tableau un
id
----
1
2
(null)
(null)
Tableau deux
id
----
1
2
(null)
(null)
(null)
Laquelle des combinaisons de valeurs nulles doit être choisie dans la jointure? Mon exemple ci-dessus se traduira par quelque chose comme une jointure croisée pour toutes les valeurs nulles.
T1_ID | T2_ID
-------+-------
1 | 1
2 | 2
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
where (a = b or (a is null and b is null))
point. c'est ce que j'en pense. Je n'envisagerais pas d'utilisersys_op_map_nonnull
, d'ignorer cet homme derrière le rideau. "