Rumah > pangkalan data > tutorial mysql > Mengapa Klausa `NOT IN` SQL Saya Tidak Berfungsi dengan Nilai NULL?

Mengapa Klausa `NOT IN` SQL Saya Tidak Berfungsi dengan Nilai NULL?

Susan Sarandon
Lepaskan: 2025-01-18 11:21:09
asal
432 orang telah melayarinya

Why Doesn't My SQL `NOT IN` Clause Work with NULL Values?

Menyelesaikan masalah NOT IN Klausa dan Nilai NULL SQL

Artikel ini menangani masalah biasa yang dihadapi apabila menggunakan klausa NOT IN dalam pertanyaan SQL: set hasil yang tidak disangka-sangka disebabkan oleh nilai NULL. Senario ini melibatkan pemilihan rekod daripada jadual Stock (dalam pangkalan data Inventory) yang tidak terdapat dalam jadual Products (dalam pangkalan data Subset).

Klausa NOT IN gagal berfungsi seperti yang diharapkan apabila lajur foreignStockId dalam jadual Products mengandungi nilai NULL. Kehadiran walaupun satu NULL dalam set hasil NOT IN subquery menyebabkan keseluruhan pertanyaan tidak mengembalikan baris.

Penyelesaian:

Untuk membetulkan ini, kita perlu mengecualikan nilai NULL secara eksplisit. Dua pendekatan berkesan dibentangkan:

1. Menggunakan IS NOT NULL:

Pendekatan ini menapis NULL daripada NOT IN subquery:

<code class="language-sql">SELECT stock.IdStock, stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL);</code>
Salin selepas log masuk

2. Menggunakan NOT EXISTS:

Klausa NOT EXISTS menyediakan alternatif yang lebih cekap dan selalunya lebih jelas:

<code class="language-sql">SELECT stock.idstock, stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock);</code>
Salin selepas log masuk

Memahami Masalah: Logik Tiga Nilai

SQL menggunakan logik tiga nilai: Benar, Salah dan Tidak Diketahui. Klausa WHERE mesti menilai kepada Benar untuk satu baris disertakan dalam set hasil. Isu timbul kerana 'A' <> NULL menilai kepada Unknown. Apabila Unknown hadir dalam perbandingan NOT IN, keseluruhan ungkapan menjadi Unknown, menghasilkan set hasil kosong.

Contoh Ilustrasi:

Pertimbangkan ini:

Predicate True False Unknown
'A' NOT IN ('X','Y',NULL) True True Unknown

Hasil Unknown berpunca daripada perbandingan 'A' dengan NULL. Oleh itu, keseluruhan klausa WHERE dinilai kepada Unknown dan tiada baris dikembalikan.

Dengan menggunakan sama ada IS NOT NULL atau NOT EXISTS, kami memintas kekaburan ini dan memastikan pertanyaan mengembalikan hasil yang dimaksudkan. Pendekatan NOT EXISTS selalunya diutamakan untuk prestasi yang dipertingkatkan dan kebolehbacaannya dalam senario sedemikian.

Atas ialah kandungan terperinci Mengapa Klausa `NOT IN` SQL Saya Tidak Berfungsi dengan Nilai NULL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan