2

有人能告诉我为什么只有第三个查询有效吗?我会理解是否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

问题 1:

SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled != 'Yes' /* is_disabled <> 'Yes' */
    AND
    is_terminated != 'Yes' /* is_terminated <> 'Yes' */

问题 2:

SELECT id, fullname FROM users
WHERE id = '1'
    AND
    is_disabled = '' /* is_disabled IS NULL */
    AND
    is_terminated = '' /* is_terminated IS NULL */

问题 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)
4

2 回答 2

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

于 2013-10-29T12:09:38.870 回答
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)。

有一个“空安全比较器”(<=>),但我总是更喜欢更明确的IS NULL(但这是个人喜好)。

SELECT NULL <=> NULL; -- 1 (TRUE)
SELECT NULL <=> 42; -- 0 (FALSE)
于 2013-10-29T12:05:21.383 回答