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)
seekor kuda tanpa nama
sumber
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. "Anda dapat bergabung dengan nilai nol menggunakan decode:
decode
memperlakukan nol sama dengan, jadi ini berfungsi tanpa angka "ajaib". Dua kolom harus memiliki tipe data yang sama.Itu tidak akan membuat kode yang paling mudah dibaca, tetapi mungkin masih lebih baik daripada
t1.id = t2.id or (t1.id is null and t2.id is null)
sumber
Mengapa Anda tidak bisa menggunakan nilai nol dalam gabungan? Di Oracle, kedua hal berikut ini tidak bernilai true:
NULL = NULL
NULL <> NULL
Itu sebabnya kami harus
IS NULL
/IS NOT NULL
untuk memeriksa nilai null.Untuk menguji ini, Anda cukup melakukan:
Bergabung sedang mengevaluasi kondisi boolean, dan mereka tidak memprogram mereka untuk beroperasi secara berbeda. Anda dapat memasukkan tanda lebih besar dari pada kondisi bergabung dan menambahkan kondisi lainnya; itu hanya mengevaluasinya sebagai ekspresi boolean.
Saya kira nol tidak bisa sama dengan nol dalam gabungan demi konsistensi. Itu akan menentang perilaku biasa operator perbandingan.
sumber
NULL = anything
hasilNULL
karena standar SQL mengatakan demikian. Baris memuaskan kondisi gabungan hanya jika ekspresi itu benar.Nilai nol di sebagian besar basis data relasional dianggap TIDAK DIKETAHUI. Jangan bingung dengan semua nol HEX. jika sesuatu mengandung null (tidak diketahui,) Anda tidak dapat membandingkannya.
Yang berarti, setiap kali Anda memiliki nol sebagai operan dalam ekspresi boolean, bagian lain akan selalu benar.
Bertentangan dengan kebencian umum terhadap null oleh pengembang, null memiliki tempatnya. Jika ada sesuatu yang tidak diketahui, gunakan null.
sumber
UNKNOWN
, bukanFALSE
;)