1

これがテーブル構造です

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行で構成されています。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

ここで何が起こっているのですか?

4

2 に答える 2

1

ステータスのある行は、リストNULLの内側でも外側でもないため、出力に表示されません。INこれらの行を取得するには、次COALESCEのように を追加します。

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

NULLこれは、列に値を持つレコードをStatus含める必要があることを効果的に示しています。

于 2013-11-03T02:04:33.830 に答える
0

レコードのみが必要な場合NULL Statusは、次のようにできます。

SELECT StudentId FROM student_classlists WHERE Status IS NULL
于 2013-11-03T01:53:08.627 に答える