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)
un cheval sans nom
la source
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. "Vous pouvez joindre des valeurs nulles en utilisant le décodage:
decode
traite les valeurs nulles comme égales, donc cela fonctionne sans nombres "magiques". Les deux colonnes doivent avoir le même type de données.Il ne rendra pas le code le plus lisible, mais probablement encore meilleur que
t1.id = t2.id or (t1.id is null and t2.id is null)
la source
Pourquoi ne pouvez-vous pas utiliser des valeurs nulles dans les jointures? Dans Oracle, les deux éléments suivants ne sont pas évalués comme vrais:
NULL = NULL
NULL <> NULL
C'est pourquoi nous devons
IS NULL
/IS NOT NULL
pour vérifier les valeurs nulles.Pour tester cela, vous pouvez simplement faire:
Les jointures évaluent une condition booléenne et ne les ont pas programmées pour fonctionner différemment. Vous pouvez mettre un signe supérieur à dans la condition de jointure et ajouter d'autres conditions; il l'évalue simplement comme une expression booléenne.
Je suppose qu'un null ne peut pas être égal à un null dans les jointures par souci de cohérence. Cela défierait le comportement habituel de l'opérateur de comparaison.
la source
NULL = anything
résulteNULL
parce que la norme SQL le dit. Une ligne ne satisfait à la condition de jointure que si l'expression est vraie.Une valeur nulle dans la plupart des bases de données relationnelles est considérée comme INCONNUE. Il ne doit pas être confondu avec tous les zéros HEX. si quelque chose contient null (inconnu), vous ne pouvez pas le comparer.
Ce qui signifie que chaque fois que vous avez un null comme opérande dans une expression booléenne, la partie else sera toujours vraie.
Contrairement à la haine générale envers null par les développeurs, null a sa place. Si quelque chose est inconnu, utilisez null.
la source
UNKNOWN
, nonFALSE
;)