Saya punya permintaan (untuk Postgres dan Informix) dengan NOT IN
klausa yang berisi subquery yang dalam beberapa kasus mengembalikan NULL
nilai, menyebabkan klausa itu (dan seluruh permintaan) gagal mengembalikan apa pun.
Apa cara terbaik untuk memahami ini? Saya dianggap NULL
sebagai sesuatu yang tidak memiliki nilai, dan karena itu tidak mengharapkan permintaan gagal, tetapi jelas itu bukan cara yang benar untuk dipikirkan NULL
.
sumber
x <> NULL
sebagai penyelesaianFALSE
, Anda akan mengharapkanNOT (x <> NULL)
untuk mengevaluasiTRUE
, dan ternyata tidak. Keduanya mengevaluasiUNKNOWN
. Kuncinya adalah bahwa baris dipilih hanya jikaWHERE
klausa (jika ada) mengevaluasi keTRUE
- baris dihilangkan jika klausul mengevaluasi salah satuFALSE
atauUNKNOWN
. Perilaku ini (secara umum, dan untukNOT IN
predikat pada khususnya) diamanatkan oleh standar SQL.NULL NOT IN (some_subquery)
Seharusnya juga tidak mengembalikan baris luar kecuali jikasome_subquery
tidak mengembalikan baris. Itulah sebabnya rencana eksekusi ketika kedua kolom memiliki Null bisa jauh lebih mahal. Contoh SQL Server