Rumah >pangkalan data >tutorial mysql >Mengapa `NOT IN` Mengembalikan Keputusan Tidak Dijangka dengan Nilai NULL dalam SQL?
Klausa NOT IN
SQL dan Nuansa Nilai NULL
Cabaran yang kerap dalam SQL melibatkan membandingkan data dengan set nilai, terutamanya apabila NULL hadir. Mari kita periksa perkara ini dengan beberapa contoh pertanyaan:
<code class="language-sql">A: SELECT 'true' WHERE 3 IN (1, 2, 3, NULL); B: SELECT 'true' WHERE 3 NOT IN (1, 2, NULL);</code>
Pertanyaan A menghasilkan keputusan, tetapi Pertanyaan B tidak. Tingkah laku ini berpunca daripada cara SQL mengendalikan NULL dalam klausa NOT IN
.
Dalam SQL, NULL menandakan nilai yang tidak diketahui atau hilang. Interaksinya dengan predikat seperti IN
dan NOT IN
dikawal oleh tetapan ANSI_NULLS
.
Dengan ANSI_NULLS
didayakan (lalai), perbandingan yang melibatkan NULL dinilai kepada UNKNOWN melainkan disemak secara eksplisit menggunakan IS NULL
atau IS NOT NULL
.
Dalam Pertanyaan A, membandingkan 3 dengan senarai yang mengandungi NULL menghasilkan penilaian BENAR kerana 3 hadir. Nilai NULL tidak menjejaskan hasil keseluruhan.
Pertanyaan B, walau bagaimanapun, menggunakan NOT IN
. Kerana ANSI_NULLS
dihidupkan, perbandingan 3 NOT IN (1, 2, NULL)
dinilai kepada TIDAK DIKETAHUI kerana perbandingan antara 3 dan NULL. Akibatnya, pertanyaan mengembalikan set kosong.
Melumpuhkan ANSI_NULLS
mengubah perkara ini. NULL dianggap seperti nilai lain. Dalam senario ini, 3 NOT IN (1, 2, NULL)
akan menilai kepada BENAR, kerana 3 berbeza daripada 1, 2 dan NULL. Oleh itu, Pertanyaan B akan menghasilkan hasil dengan ANSI_NULLS
dimatikan.
Ini menekankan kepentingan tetapan ANSI_NULLS
apabila berurusan dengan NULL dalam SQL. Dengan mengurus tetapan ini, anda mengawal tingkah laku predikat yang melibatkan NULL dan memperoleh hasil pertanyaan yang diingini.
Atas ialah kandungan terperinci Mengapa `NOT IN` Mengembalikan Keputusan Tidak Dijangka dengan Nilai NULL dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!