MySQL:选择列为空的行

ztmd8pv5  于 2023-04-28  发布在  Mysql
关注(0)|答案(9)|浏览(125)

我遇到了一个问题,当我试图选择某个列为NULL的行时,它返回一个空集。然而,当我在phpMyAdmin中查看该表时,它对大多数行显示为null。
我的查询看起来像这样:

SELECT pid FROM planets WHERE userid = NULL

每次都是空的。
很多地方说要确保它不被存储为“NULL”或“null”而不是实际值,还有一个地方说要尝试只查找一个空格(userid = ' '),但这些都没有工作。有人建议不要使用MyISAM而使用innoDB,因为MyISAM在存储null时有问题。我把表切换到了innoDB,但现在我觉得问题可能是它实际上仍然不是null,因为它可能转换它的方式。我想这样做,而不必将表重新创建为innoDB或其他任何东西,但如果必须这样做,我当然可以尝试。

jgzswidk

jgzswidk1#

SQL NULL是特殊的,你必须执行WHERE field IS NULL,因为NULL不能等于任何值,
包括自身(即:NULL = NULL始终为false)。
参见Rule 3https://en.wikipedia.org/wiki/Codd%27s_12_rules

des4xlb0

des4xlb02#

SELECT pid FROM planets WHERE userid IS NULL
e5nszbig

e5nszbig3#

既然大家都有了答案,我想再补充一点。我也遇到过同样的问题。
为什么你的查询失败了?你有

SELECT pid FROM planets WHERE userid = NULL;

这不会给予您预期的结果,因为从mysql doc
在SQL中,NULL值与任何其他值(即使是NULL)相比永远不会为true。包含NULL的表达式总是产生NULL值,除非在表达式中涉及的运算符和函数的文档中另有说明。
强调我的。
若要搜索为NULL的列值,不能使用expr = NULL测试。以下语句不返回行,因为
expr = NULL对于任何表达式都不为真

溶液

SELECT pid FROM planets WHERE userid IS NULL;

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

lnlaulya

lnlaulya4#

还有一个<=>操作符:

SELECT pid FROM planets WHERE userid <=> NULL

<=>也可以用于非NULL值:
SELECT NULL <=> NULL产生1
SELECT 42 <=> 42也产生1
请参阅: www.example.com

yrefmtwq

yrefmtwq5#

来自http://w3schools.com/sql/sql_null_values.asp的信息:
1)NULL值表示缺少未知数据。
2)默认情况下,表列可以保存NULL值。
3)NULL值与其他值的处理方式不同
4)不可能比较NULL和0;它们不是等价的。
5)不可能使用比较运算符(例如=、〈或〈〉)来测试NULL值。
6)我们将不得不使用ISNULL和ISNOTNULL运算符
如果你的问题:

SELECT pid FROM planets WHERE userid IS NULL
34gzjxbg

34gzjxbg6#

有相同的问题,其中查询:

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

未返回值。似乎是MyISAM的问题,对InnoDB中的数据进行相同的查询返回了预期的结果。
与:

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

返回所有预期结果。

wbrvyc0a

wbrvyc0a7#

SELECT pid FROM planets WHERE userid is null;
mqxuamgl

mqxuamgl8#

我在将数据库从Access转换为MySQL时遇到了同样的问题(使用 www.example.com 与数据库通信)。
我需要评估一个字段(字段类型varchar(1))是否为null。
这句话适用于我的场景:

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

8iwquhpp9#

用这个代码替换它就可以了
SELECT pid FROM planets WHERE userid IS NULL

相关问题