Perché un null non può essere uguale a un null per il bene di un join?
Di 'a Oracle di farlo:
select *
from one t1
join two t2 on coalesce(t1.id, -1) = coalesce(t2.id, -1);
(Si noti che in SQL standard è possibile utilizzare t1.id is not distinct from t2.id
per ottenere un operatore di parità null-safe, ma Oracle non lo supporta)
Questo funzionerà solo se il valore di sostituzione (-1 nell'esempio sopra) non viene effettivamente visualizzato nella tabella. Trovare un valore "magico" per i numeri potrebbe essere possibile, ma sarà molto difficile per i valori dei caratteri (soprattutto perché Oracle tratta anche una stringa vuota null
)
Inoltre: non id
verrà utilizzato alcun indice sulle colonne (è possibile definire un indice basato sulle funzioni con l' coalesce()
espressione).
Un'altra opzione che funziona per tutti i tipi, senza valori magici:
on t1.id = t2.id or (t1.id is null and t2.id is null)
Ma la vera domanda è: ha senso?
Considera i seguenti dati di esempio:
Tabella uno
id
----
1
2
(null)
(null)
Tabella due
id
----
1
2
(null)
(null)
(null)
Quale delle combinazioni di valori null deve essere scelta nel join? Il mio esempio sopra si tradurrà in qualcosa come un cross join per tutti i valori null.
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))
. questo è il mio pensiero al riguardo. Non prenderei in considerazione l'usosys_op_map_nonnull
, ignoro quell'uomo dietro il sipario. "