2013-11-03 63 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

相关问题