WHERE子句中的NULL和空列选择失败

时间:2013-10-29 12:02:01

标签: mysql sql database

有人可以告诉我为什么只有第三个查询有效吗?我会理解,如果NULLempty column/string被区别对待,但为什么第二个查询不起作用?将is_disabledis_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)

2 个答案:

答案 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中,NULLEmpty 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