2013-11-03 100 views
1

這是表結構MySQL的「其中」產生正確的結果,但「WHERE NOT IN」不

CREATE TABLE `student_classlists` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `SessionCode` int(5) DEFAULT NULL, 
    `CourseCode` varchar(10) DEFAULT NULL, 
    `SectionCode` varchar(1) DEFAULT NULL, 
    `LastName` varchar(255) DEFAULT NULL, 
    `FirstName` varchar(255) DEFAULT NULL, 
    `StudentId` int(10) unsigned DEFAULT NULL, 
    `FinalGradeSIS` int(10) DEFAULT NULL, 
    `Status` varchar(10) DEFAULT NULL, 
    `Faculty` varchar(255) DEFAULT '', 
    `Email` varchar(255) DEFAULT NULL, 
    `ClassListDate` date DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=576 DEFAULT CHARSET=utf8; 

Status列在很大程度上是由NULL行,只有少數例外。我試圖忽略那些不爲空的記錄。以下查詢不起作用:

SELECT StudentId FROM student_classlists WHERE `Status` NOT IN ('Drop') GROUP BY StudentId 

出於某種原因,它會產生意外的和空的結果。但是,隨着跌落NOT的唯一例外的一個非常類似的查詢將產生預期的結果

SELECT StudentId FROM student_classlists WHERE `Status` IN ('Drop') GROUP BY StudentId 

這裏發生了什麼?

+2

看到一些數據將是有用的 – 2013-11-03 01:50:39

+2

三值邏輯的另一個受害者。檢查出http://stackoverflow.com/questions/129077/not-in-constraint-and-null-values的相反。 –

回答

1

行與NULL狀態將不會出現在輸出中,因爲它們既不是內部也不是IN名單之外。要獲得這些行,添加COALESCE,像這樣:

SELECT StudentId 
FROM student_classlists 
WHERE COALESCE(`Status` NOT IN ('Drop'), 1) 
GROUP BY StudentId 

這實際上說,與在StatusNULL值的記錄必須包括在內。

+0

太好了 - 我感覺有些事情至關重要,我不瞭解MySQL ...謝謝! – Levi

0

如果只想NULLStatus記錄,你可以這樣做:

SELECT StudentId FROM student_classlists WHERE Status IS NULL 
+0

將無法​​正常工作 - 嘗試過! – Levi

相關問題