在连接期间比较空值
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)
而且您无法与 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
我读到 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)
而且您无法与 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