在连接期间比较空值

时间:2017-10-12 19:05:46

标签: mysql join natural-join

我读到null无法与null比较,结果始终为false。

在下面的链接中,我可以比较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

那么关于空值比较的正确陈述是什么?

3 个答案:

答案 0 :(得分:3)

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

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

DEMO

你无法与NULL进行比较,了解它的含义就像未定义的那样。虽然,您可以测试值是否为NULL

答案 1 :(得分:3)

您正在使用' NULL' (一个字符串)not NULL ..所以你要比较两个(相同的)字符串

在mysql中有一个null安全操作符,将两个空值

比较为true
  <=>

NULL-safe相等。此运算符执行与=运算符相等的比较,但如果两个操作数均为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

答案 2 :(得分:1)

在你的答案中,你将NULL比作varchar,而不是普通的NULL。