在连接期间比较空值

Comparing nulls during join

我读到 null 不能与 null 进行比较,结果总是 false。

在下面的 link 中,我能够比较 2 个空值并返回行。

CREATE TABLE user (id varchar(50), banstatus varchar(100));
INSERT INTO user (id, banstatus) VALUES ('1', '1');
INSERT INTO user values ('2', 'NULL');

CREATE TABLE banstatus (id varchar(50), texti varchar(100));
INSERT INTO banstatus VALUES('1', 'Banned');
Insert into banstatus values ('NULL' , 'NULL');

select * from user as u
join banstatus as b on u.banstatus=b.id

http://sqlfiddle.com/#!9/33f25/1/0

那么关于空值比较的正确说法是什么?

您插入的值是字符串。 'NULL'是一个字符串,是一个确定的值。要插入 NULL,您不应使用引号,例如:

INSERT INTO table (field1, field2) VALUES ('foo', NULL)

DEMO

而且您无法与 NULL 进行比较,以了解其含义,它类似于未定义。虽然,您可以测试一个值是否为 NULL.

在您的回答中,您将 NULL 与 varchar 进行了比较,而不是普通的 NULL。

您使用的是 'NULL'(字符串)而不是 NULL .. 所以您正在比较两个(相同的)字符串

在 mysql 中有一个 null 安全运算符,它将两个 null 值都比较为真

  <=>

NULL 安全等于。此运算符执行与 = 运算符类似的相等比较,但 returns 如果两个操作数均为 NULL,则为 1 而不是 NULL,如果一个操作数为 NULL,则为 0 而不是 NULL。

https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to

因此,对于正确的空安全连接,您应该使用

 select * from user as u
 join banstatus as b on u.banstatus<=>b.id