Rumah >pangkalan data >tutorial mysql >Mengapa `NOT IN` Mengembalikan Keputusan Tidak Dijangka dengan Nilai NULL dalam SQL?

Mengapa `NOT IN` Mengembalikan Keputusan Tidak Dijangka dengan Nilai NULL dalam SQL?

Susan Sarandon
Susan Sarandonasal
2025-01-23 12:36:12817semak imbas

Why Does `NOT IN` Return Unexpected Results with NULL Values in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn