MySQL:选择列为空的行

322

我遇到一个问题,当我尝试选择某个列为空的行时,它返回一个空集。然而,当我在phpMyAdmin中查看表时,大多数行都显示为null。

我的查询类似于以下内容:

SELECT pid FROM planets WHERE userid = NULL

每次都是空集。

许多地方说要确保它不是存储为 "NULL" 或 "null" 而不是实际值,有人建议尝试查找只有一个空格的情况 (userid = ' '),但这些都没有起作用。有人建议不要使用 MyISAM,改用 innoDB,因为 MyISAM 有问题无法存储 null 值。我将表切换到 innoDB,但现在我感觉问题可能是由于它可能会转换它而导致它仍然不是实际上的空值。我希望在不必重新创建表格为 innoDB 或其他任何东西的情况下完成此操作,但如果必须这样做,我当然可以尝试一下。


1
MyISAM没有存储null的问题。NULL本身的语义应该与引擎无关。 - MarkR
9个回答

608

SQL中的NULL很特殊,您必须使用WHERE field IS NULL,因为NULL不能等于任何值,包括它本身(即:NULL = NULL始终为false)。

请参见Codd的12条规则中的第3条。


27
未知并非假。SQL使用三值逻辑。 - Martin Smith
43
NULL = NULL并不等同于FALSE,它仍然是NULL。但同时也不等于TRUE,所以IF(NULL = NULL)语句也不会被执行。 - Konerak
1
参见 @obe 的答案:SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 - Thomas
1
null 不仅不等于任何东西,也不是不等于任何东西。换句话说,select * from foo where bar <> "abc" 不会返回 bar 为 null 的行。今天这让我感到困惑。文档称 <> 为“不等于”运算符,但实际上它是“等于其他值”的运算符。 - StackOverthrow

94
SELECT pid FROM planets WHERE userid IS NULL

49

作为已有答案的补充,我想再多说一点。我也曾面临同样的问题。

你的查询为什么失败了?你有:

SELECT pid FROM planets WHERE userid = NULL;

这不会给你预期的结果,因为从mysql文档中可以得知:

在SQL中,与任何其他值相比,NULL值永远不为真,甚至是NULL本身。包含NULL的表达式总是产生一个NULL值,除非操作符和函数的文档另有说明。

我强调了这一点。

要搜索列值为NULL的记录,不能使用expr = NULL测试。由于expr = NULL对于任何表达式都不成立,所以以下语句不返回任何行

解决方案

SELECT pid FROM planets WHERE userid IS NULL; 

要测试是否为NULL,请使用IS NULLIS NOT NULL运算符。


26

12

摘自http://w3schools.com/sql/sql_null_values.asp的信息:

1) NULL值表示缺失的未知数据。

2) 默认情况下,表列可以包含NULL值。

3) NULL值与其他值的处理方式不同。

4) 不可能比较NULL和0;它们是不等价的。

5) 不可能使用比较运算符(如=、<或<)测试NULL值。

6) 相反,我们必须使用IS NULL和IS NOT NULL运算符。

因此,在你的问题情况下:

SELECT pid FROM planets WHERE userid IS NULL

9
SELECT pid FROM planets WHERE userid is null;

9

我遇到了同样的问题,查询语句如下:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

返回的数值为空。似乎有一个MyISAM的问题,而在InnoDB中对同样的数据进行查询则返回了期望的结果。

最终选择:

SELECT * FROM 'column' WHERE 'column' = ' '; 

返回了所有预期的结果。


0

当我将数据库从Access转换为MySQL(使用vb.net与数据库通信)时,遇到了同样的问题。

我需要评估一个字段(字段类型varchar(1))是否为空。

这个语句适用于我的情况:

SELECT * FROM [table name] WHERE [field name] = ''

1
如果这对您有用,那么您的varchar(1)的默认值为''而不是null,因此与此问题无关。 - さりげない告白

-1

用这段代码替换原来的代码,它会正常工作

SELECT pid FROM planets WHERE userid IS NULL


1
请勿重复现有答案,除非您想分享新的见解。 - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接