MySQL:选择列为空的行


270

我遇到一个问题,当我尝试选择某个列的值为NULL的行时,它将返回一个空集。但是,当我查看phpMyAdmin中的表时,对于大多数行,它表示为null。

我的查询看起来像这样:

SELECT pid FROM planets WHERE userid = NULL

每次都清空。

据说有很多地方都确保不会将其存储为“ NULL”或“ null”,而不是实际值,还有很多地方试图仅查找空格(userid = ' '),但没有一个起作用。建议不要使用MyISAM并使用innoDB,因为MyISAM无法存储null。我将表切换到innoDB,但是现在我觉得问题可能是由于它转换表的方式实际上它仍然不是null。我想要执行此操作而不必将表重新创建为innoDB或其他任何方式,但是如果需要的话,我当然可以尝试一下。


1
MyISAM毫不费力地存储null。NULL本身的语义应独立于引擎。
MarkR 2010年

Answers:


512

SQL NULL的特殊之处,您必须这样做WHERE field IS NULL,因为NULL不能等于任何东西,

包括自身(即:NULL = NULL始终为false)。

参见Rule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules


24
不明-不为假。SQL使用三种有价值的逻辑。
马丁·史密斯

38
NULL = NULL不是真的FALSE-再次为NULL。但这也不是TRUE,因此IF(NULL = NULL)将不会执行。
Konerak 2011年

1
另请参见@obe答案:SELECT 1 <=> 1,NULL <=> NULL,1 <=> NULL; ->
托马斯

null不仅不等于任何东西,也不也不等于任何东西。换句话说,select * from foo where bar <> "abc"不会在那里栏为空返回行。今天让我感到困惑。文档将<>其称为“不等于”运算符,但实际上是“等于”以外的其他运算符。
StackOverthrow


39

给出所有答案后,我想补充一点。我也遇到过同样的问题。

为什么查询失败?你有,

SELECT pid FROM planets WHERE userid = NULL;

这不会给您预期的结果,因为来自mysql doc

在SQL中,与其他任何值(甚至是NULL)相比NULL值从不为真。包含NULL的表达式始终会产生NULL值,除非文档中针对表达式中涉及的运算符和函数另有说明。

强调我的。

要搜索为的列值NULL,您不能使用expr = NULL测试。以下语句不返回任何行,因为expr = NULL对于任何表达式都不是真的

SELECT pid FROM planets WHERE userid IS NULL; 

要进行测试NULL,请使用IS NULLIS NOT NULL运算符。



11

来自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

7

在查询中存在相同的问题:

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,因此与该问题无关。
さりげない告白2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.