Mengapa nol tidak bisa sama dengan nol demi bergabung?
Katakan saja kepada Oracle untuk melakukan itu:
select *
from one t1
join two t2 on coalesce(t1.id, -1) = coalesce(t2.id, -1);
(Perhatikan bahwa dalam SQL standar yang dapat Anda gunakan t1.id is not distinct from t2.id
untuk mendapatkan operator kesetaraan nol-aman, tetapi Oracle tidak mendukung itu)
Tetapi ini hanya akan berfungsi jika nilai penggantian (-1 pada contoh di atas) tidak benar-benar muncul dalam tabel. Menemukan nilai "ajaib" untuk angka mungkin dimungkinkan, tetapi akan sangat sulit untuk nilai karakter (terutama karena Oracle juga memperlakukan string kosong null
)
Plus: tidak ada indeks pada id
kolom yang akan digunakan (Anda dapat menentukan indeks berdasarkan fungsi dengan coalesce()
ekspresi).
Opsi lain yang berfungsi untuk semua jenis, tanpa nilai ajaib:
on t1.id = t2.id or (t1.id is null and t2.id is null)
Tetapi pertanyaan sebenarnya adalah: apakah ini masuk akal?
Pertimbangkan contoh data berikut:
Tabel satu
id
----
1
2
(null)
(null)
Tabel dua
id
----
1
2
(null)
(null)
(null)
Kombinasi nilai nol mana yang harus dipilih dalam gabungan? Contoh saya di atas akan menghasilkan sesuatu seperti gabungan silang untuk semua nilai nol.
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))
titik. itu adalah pemikiran saya di atasnya. Saya tidak akan mempertimbangkan untuk menggunakansys_op_map_nonnull
, mengabaikan orang itu di balik tirai. "