MySQL:选择列为空的行
Posted
技术标签:
【中文标题】MySQL:选择列为空的行【英文标题】:MySQL: selecting rows where a column is null 【发布时间】:2011-04-01 23:43:45 【问题描述】:我遇到了一个问题,当我尝试为某个列选择具有 NULL 的行时,它返回一个空集。但是,当我查看 phpMyAdmin 中的表格时,大多数行都显示为 null。
我的查询如下所示:
SELECT pid FROM planets WHERE userid = NULL
每次都是空集。
很多地方说要确保它不存储为“NULL”或“null”而不是实际值,还有一个说尝试只寻找一个空格 (userid = ' '
),但这些都没有奏效。有人建议不要使用 MyISAM 并使用 innoDB,因为 MyISAM 无法存储 null。我将表切换到innoDB,但现在我觉得问题可能是它实际上仍然不是空的,因为它可能会转换它。我想这样做,而不必将表重新创建为 innoDB 或其他任何东西,但如果必须,我当然可以尝试。
【问题讨论】:
MyISAM 存储空值没有问题。 NULL 本身的语义应该独立于引擎。 【参考方案1】:SELECT pid FROM planets WHERE userid is null;
【讨论】:
【参考方案2】:SQL NULL 的特殊性,你必须这样做WHERE field IS NULL
,因为 NULL 不能等于任何东西,
包括自身(即:NULL = NULL 始终为假)。
见Rule 3
https://en.wikipedia.org/wiki/Codd%27s_12_rules
【讨论】:
未知 - 不是假的。 SQL 使用三值逻辑。 NULL = NULL 并不是真正的 FALSE - 它又是 NULL。但它也不是 TRUE,所以 IF(NULL = NULL) 不会执行。 另见@obe 答案:SELECT 1 1, NULL NULL, 1 NULL; -> 1, 1, 0 null 不仅不等于任何东西,也不等于任何东西。换句话说,select * from foo where bar <> "abc"
将不返回 bar 为空的行。这让我今天陷入了困境。文档将<>
称为“不等于”运算符,但实际上它是“等于”运算符。【参考方案3】:
在查询中遇到同样的问题:
SELECT * FROM 'column' WHERE 'column' IS NULL;
没有返回值。 似乎是 MyISAM 的问题,对 InnoDB 中数据的相同查询返回了预期结果。
去:
SELECT * FROM 'column' WHERE 'column' = ' ';
返回所有预期结果。
【讨论】:
【参考方案4】:来自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
【讨论】:
【参考方案5】:还有一个<=>
运算符:
SELECT pid FROM planets WHERE userid <=> NULL
会工作的。好消息是 <=>
也可以与非 NULL 值一起使用:
SELECT NULL <=> NULL
产生1
。
SELECT 42 <=> 42
也会产生 1
。
请看这里:https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to
【讨论】:
【参考方案6】:我在将数据库从 Access 转换为 MySQL 时遇到了同样的问题(使用 vb.net 与数据库通信)。
我需要评估一个字段(字段类型 varchar(1))是否为空。
此语句适用于我的场景:
SELECT * FROM [table name] WHERE [field name] = ''
【讨论】:
如果这对你有用,你的 varchar(1) 的默认值是 '' 而不是 null,因此与这个问题无关。【参考方案7】:既然都给出了答案,我想再补充一点。我也遇到过同样的问题。
为什么您的查询失败了?你有,
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 NULL
和IS NOT NULL
运算符。
NULL
。
operator IS NOT NULL 测试一个值是否不是NULL
。
MySQL comparison operators
【讨论】:
【参考方案8】:SELECT pid FROM planets WHERE userid IS NULL
【讨论】:
以上是关于MySQL:选择列为空的行的主要内容,如果未能解决你的问题,请参考以下文章