Memahami NULL dan NOT IN
Klausa
Ketidakkonsistenan sering timbul apabila menggunakan klausa NOT IN
berbanding dengan LEFT JOIN
s, terutamanya apabila berurusan dengan nilai NULL
. Mari kita periksa ini dengan dua contoh pertanyaan:
Pertanyaan A:
<code class="language-sql">SELECT 'true' WHERE 3 IN (1, 2, 3, NULL);</code>
Pertanyaan B:
<code class="language-sql">SELECT 'true' WHERE 3 NOT IN (1, 2, NULL);</code>
Pertanyaan A menghasilkan hasil, manakala Pertanyaan B tidak. Perbezaan ini berpunca daripada cara SQL mengendalikan perbandingan yang melibatkan nilai NULL
.
Membedah Pertanyaan
Mari kita pecahkan setiap pertanyaan untuk memahami tingkah laku:
Pertanyaan A:
Pertanyaan ini boleh dipermudahkan kepada:
<code class="language-sql">SELECT 'true' WHERE 3 = 1 OR 3 = 2 OR 3 = 3 OR 3 = NULL;</code>
Oleh kerana 3 = 3
menilai kepada TRUE
, pertanyaan mengembalikan hasil.
Pertanyaan B:
Pertanyaan ini dipermudahkan kepada:
<code class="language-sql">SELECT 'true' WHERE 3 != 1 AND 3 != 2 AND 3 != NULL;</code>
Dengan ANSI_NULLS
didayakan (lalai dalam kebanyakan pangkalan data SQL), 3 != NULL
menilai kepada UNKNOWN
. Keadaan AND
dengan UNKNOWN
menyebabkan keseluruhan predikat menjadi UNKNOWN
, menyebabkan tiada baris dikembalikan.
Jika ANSI_NULLS
dilumpuhkan, 3 != NULL
menilai kepada TRUE
, berpotensi mengembalikan baris.
Kesimpulan
Kehadiran nilai NULL
dalam klausa NOT IN
memberi kesan ketara kepada hasil pertanyaan disebabkan oleh logik tiga nilai SQL (BENAR, SALAH, TIDAK DIKENALI) dan tetapan ANSI_NULLS
. Adalah penting untuk mengetahui tingkah laku ini apabila menggunakan nilai NULL
untuk mengelakkan hasil yang tidak dijangka. Menggunakan semakan LEFT JOIN
dan IS NULL
selalunya memberikan alternatif yang lebih dipercayai untuk mengendalikan nilai NULL
dalam senario sedemikian.
Atas ialah kandungan terperinci Bagaimanakah Nilai NULL Mempengaruhi Hasil Klausa NOT IN?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!