当MySQL在MySQL中不是NULL时

时间:2014-06-16 03:43:12

标签: mysql sql

我已经从Access导入了一个数据库,并且有一些列显示了一些异常行为。特定列的类型为datetime,允许使用NULL值。原始数据集有一些带有日期的行,有些带有null,我试图选择所有没有日期的行(IS NULL)并且总是返回"空集"。请原谅可怕的专栏名称,长篇故事,并查看带有三个字段PK的缩写表,然后是相关专栏:

+-----------------------------------------+-------------+------+-----+---------+
| Field                                   | Type        | Null | Key | Default |
+-----------------------------------------+-------------+------+-----+---------+
| HID                                     | varchar(50) | NO   | PRI | NULL    |
| yr                                      | varchar(50) | NO   | PRI | NULL    |
| mo                                      | varchar(50) | NO   | PRI | NULL    |
| wanem deit yu yu risivim ol meresin     | datetime    | YES  |     | NULL    |

对它运行一个简单的查询会产生以下结果:

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" IS NOT NULL LIMIT 5;
+-----+------+----+-------------------------------------+
| hid | yr   | mo | wanem deit yu yu risivim ol meresin |
+-----+------+----+-------------------------------------+
| 109 | 2010 | 01 | NULL                                |
| 109 | 2011 | 03 | NULL                                |
| 109 | 2012 | 01 | 2011-11-11 00:00:00                 |
| 109 | 2012 | 02 | 2011-11-11 00:00:00                 |
| 109 | 2012 | 03 | NULL                                |
+-----+------+----+-------------------------------------+
5 rows in set (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" IS NULL LIMIT 5;
Empty set (0.00 sec)

非常奇怪的行为,所以我想也许它可能是一个字符串,多亏了可能有错误的导入,所以我打破了书中的每个规则尝试以下,没有什么能让我获得NULL分隔的行来自那些有价值观的人。

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = "NULL" LIMIT 5;
Empty set (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = NULL LIMIT 5;
Empty set (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = 0 LIMIT 5;
+-----+------+----+-------------------------------------+
| hid | yr   | mo | wanem deit yu yu risivim ol meresin |
+-----+------+----+-------------------------------------+
| 109 | 2010 | 01 | NULL                                |
| 109 | 2011 | 03 | NULL                                |
| 109 | 2012 | 01 | 2011-11-11 00:00:00                 |
| 109 | 2012 | 02 | 2011-11-11 00:00:00                 |
| 109 | 2012 | 03 | NULL                                |
+-----+------+----+-------------------------------------+
5 rows in set, 1 warning (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = "" LIMIT 5;
Empty set (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = '' LIMIT 5;
Empty set (0.00 sec)

所以我有点难过。我发现了很多其他的stackoverflow文章"我如何选择空值"但没有一个"不是空的"如此奇怪地返回其中带有NULL的行(并且每次IS NULL都返回一个Empty集)。

1 个答案:

答案 0 :(得分:5)

where 子句中尝试使用反向刻度而不是双引号,因为它的字段名称

SELECT hid,
       yr,
       mo,
       `wanem deit yu yu risivim ol meresin`
FROM AP
WHERE `wanem deit yu yu risivim ol meresin` IS NULL LIMIT 5;

实际上,下面的查询不会检查NOT NULL where 条件,这就是为什么它返回所有记录后,查询返回滴答而非双引号,如

SELECT hid,
       yr,
       mo,
       `wanem deit yu yu risivim ol meresin`
FROM AP
WHERE `wanem deit yu yu risivim ol meresin` IS NOT NULL LIMIT 5;