有人可以告诉我为什么只有第三个查询有效吗?我会理解,如果NULL
和empty column/string
被区别对待,但为什么第二个查询不起作用?将is_disabled
和is_terminated
转换为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
QUERY 1:
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled != 'Yes' /* is_disabled <> 'Yes' */
AND
is_terminated != 'Yes' /* is_terminated <> 'Yes' */
QUERY 2:
SELECT id, fullname FROM users
WHERE id = '1'
AND
is_disabled = '' /* is_disabled IS NULL */
AND
is_terminated = '' /* is_terminated IS NULL */
QUERY 3:
SELECT id, fullname FROM users
WHERE id = '1'
AND
(is_disabled = '' OR is_disabled IS NULL)
AND
(is_terminated = '' OR is_terminated IS NULL)
答案 0 :(得分:2)
与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
不是TRUE
(也不是FALSE
)。
有一个“null-safe comparator”(<=>
),但我总是更喜欢更明确IS NULL
(但这是个人品味)。
SELECT NULL <=> NULL; -- 1 (TRUE)
SELECT NULL <=> 42; -- 0 (FALSE)
答案 1 :(得分:2)
在MySQL中,NULL
与Empty String
不同。因此column = ''
不等于column IS NULL
。
由于OR
条件,第三个查询按预期工作。让我来说明一下。
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
第二个查询失败,因为此条件is_terminated = ''
返回NULL
,使整个WHERE
条件NULL
。