MySQL “WHERE IN” 产生正确的结果但 “WHERE NOT IN” 没有

标签 mysql debugging

这是表结构

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 行组成,只有少数异常(exception)。我试图忽略那些不为空的记录。以下查询不起作用:

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

出于某种原因,它会产生意想不到的空结果。但是一个非常相似的查询,唯一的异常(exception)是删除了 NOT 产生了预期的结果

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

这里发生了什么?

最佳答案

具有 NULL 状态的行不会出现在输出中,因为它们既不在 IN 列表之内也不在 IN 列表之外。要获取这些行,请添加 COALESCE,如下所示:

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

这实际上表明必须包含 Status 列中具有 NULL 值的记录。

关于MySQL “WHERE IN” 产生正确的结果但 “WHERE NOT IN” 没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749020/

相关文章:

Mysql逗号分隔值

PHP - 每组显示一次类别

c++ - 如何在函数返回的 GDB 中设置断点?

r - 在函数中获取浏览状态

mysql - 如何使用 XML_LOAD() 将 XML 文件导入 MySQL 数据库表;功能

mysql - 列出今天的约会 mysql 查询

mysql - phpMyAdmin 对 IIS7.5 权限未授予

android - 我在哪里可以找到包含我的应用程序共享库符号版本的目录以使用 ndk-stack?

visual-studio - VS2015 Visualiser, (*.natvis) DisplayString 调用函数显示值

debugging - Visual Studio Code - 找不到方法 RPCServer.Eval