Mysql WHERE子句中的NULL和空列选择失败
有人能告诉我为什么只有第三个查询有效吗?如果Mysql WHERE子句中的NULL和空列选择失败,mysql,sql,database,Mysql,Sql,Database,有人能告诉我为什么只有第三个查询有效吗?如果NULL和empty column/string得到不同的对待,我会理解,但为什么第二次查询不起作用?将转换为VARCHAR(3)也没有帮助 谢谢 表格: CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `fullname` varbinary(100) NOT NULL, `is_disabled` enum('Yes') DEFAULT NULL
NULL
和empty column/string
得到不同的对待,我会理解,但为什么第二次查询不起作用?将转换为VARCHAR(3)
也没有帮助
谢谢
表格:
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fullname` varbinary(100) NOT NULL,
`is_disabled` enum('Yes') DEFAULT NULL,
`is_terminated` enum('Yes') DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id - fullname - is_disabled - is_terminated
1 - User One - {this is just empty column} - NULL
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled != 'Yes' /* is_disabled <> 'Yes' */
AND
is_terminated != 'Yes' /* is_terminated <> 'Yes' */
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled = '' /* is_disabled IS NULL */
AND
is_terminated = '' /* is_terminated IS NULL */
SELECT id, fullname FROM users
WHERE id = '1'
AND
(is_disabled = '' OR is_disabled IS NULL)
AND
(is_terminated = '' OR is_terminated IS NULL)
数据:
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fullname` varbinary(100) NOT NULL,
`is_disabled` enum('Yes') DEFAULT NULL,
`is_terminated` enum('Yes') DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id - fullname - is_disabled - is_terminated
1 - User One - {this is just empty column} - NULL
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled != 'Yes' /* is_disabled <> 'Yes' */
AND
is_terminated != 'Yes' /* is_terminated <> 'Yes' */
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled = '' /* is_disabled IS NULL */
AND
is_terminated = '' /* is_terminated IS NULL */
SELECT id, fullname FROM users
WHERE id = '1'
AND
(is_disabled = '' OR is_disabled IS NULL)
AND
(is_terminated = '' OR is_terminated IS NULL)
查询1:
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fullname` varbinary(100) NOT NULL,
`is_disabled` enum('Yes') DEFAULT NULL,
`is_terminated` enum('Yes') DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id - fullname - is_disabled - is_terminated
1 - User One - {this is just empty column} - NULL
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled != 'Yes' /* is_disabled <> 'Yes' */
AND
is_terminated != 'Yes' /* is_terminated <> 'Yes' */
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled = '' /* is_disabled IS NULL */
AND
is_terminated = '' /* is_terminated IS NULL */
SELECT id, fullname FROM users
WHERE id = '1'
AND
(is_disabled = '' OR is_disabled IS NULL)
AND
(is_terminated = '' OR is_terminated IS NULL)
查询3:
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fullname` varbinary(100) NOT NULL,
`is_disabled` enum('Yes') DEFAULT NULL,
`is_terminated` enum('Yes') DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
id - fullname - is_disabled - is_terminated
1 - User One - {this is just empty column} - NULL
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled != 'Yes' /* is_disabled <> 'Yes' */
AND
is_terminated != 'Yes' /* is_terminated <> 'Yes' */
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled = '' /* is_disabled IS NULL */
AND
is_terminated = '' /* is_terminated IS NULL */
SELECT id, fullname FROM users
WHERE id = '1'
AND
(is_disabled = '' OR is_disabled IS NULL)
AND
(is_terminated = '' OR is_terminated IS NULL)
与NULL
相比的任何内容都是NULL
SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL
与NULL
相比的任何内容都是NULL
SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL
在MySQL中,NULL
不同于空字符串。所以column=''
不等于column为NULL
SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL
由于或
条件,第三个查询的工作方式与您预期的一样。让我举例说明
d = '1' AND (is_disabled = '' OR is_disabled IS NULL) AND (is_terminated = '' OR is_terminated IS NULL)
TRUE AND ( TRUE OR FALSE) AND (FALSE OR TRUE)
TRUE AND TRUE AND TRUE
.... making the condition ALL TRUE
第二个查询失败,因为这个条件被终止='
,它返回到NULL
使整个WHERE
条件NULL在MySQL中,NULL
与空字符串不同。所以column=''
不等于column为NULL
SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL
由于或
条件,第三个查询的工作方式与您预期的一样。让我举例说明
d = '1' AND (is_disabled = '' OR is_disabled IS NULL) AND (is_terminated = '' OR is_terminated IS NULL)
TRUE AND ( TRUE OR FALSE) AND (FALSE OR TRUE)
TRUE AND TRUE AND TRUE
.... making the condition ALL TRUE
第二个查询失败,因为此条件被终止='
,返回到NULL
使整个在其中
条件NULL您可以将此(被禁用=''或被禁用为NULL)
更改为此如果为NULL(被禁用,')=''
@Justin尽管这在语法上是有效的,但这种情况可能会阻止在禁用的上使用索引。首选第一种形式。您可以将此(is_disabled=''或is_disabled is NULL)
更改为此ifnull(is_disabled'')='
@Justin尽管这在语法上是有效的,但这种情况可能会阻止在is_disabled
上使用索引。首选第一种形式。NULL
的计算结果为FALSE
并不完全正确,因为notnull=NULL
的计算结果不是TRUE
。更好的方法是说“NULL
的计算结果不是TRUE
”。三元逻辑可能非常混乱……的确如此,而且它的计算结果也不是FALSE
。事实上,它的评估结果是<代码>空值
;)谢谢,我修正了。NULL
的计算结果为FALSE
并不完全正确,因为notnull=NULL
的计算结果不是TRUE
。更好的方法是说“NULL
的计算结果不是TRUE
”。三元逻辑可能非常混乱……的确如此,而且它的计算结果也不是FALSE
。事实上,它的评估结果是<代码>空值
;)谢谢,我修好了。
SELECT NULL = 1; -- NULL
SELECT NULL = NULL; -- NULL
SELECT NULL <> 1; -- NULL
SELECT NULL <> NULL; -- NULL
SELECT NULL = ''; -- NULL
SELECT NULL <> ''; -- NULL