2017-10-12 60 views
1

我讀到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

那麼,什麼是零點左右比較正確的說法?

+1

'NULL' 字符串(如你)是不一樣的NULL http://sqlfiddle.com/#! 9/0f1cce/1/0即使第二個現在是'NULL'非空字符串,這個小提琴只顯示返回1個記錄。所以要回答,「那麼關於空值比較的正確說法是什麼?」你讀過什麼。 – xQbert

+1

考慮這些case語句:http://sqlfiddle.com/#!9/0f1cce/7/1'如果banstatus爲null,則'其空'結束爲isNull, case banstatus = null then'NULL = NULL' else'NOT Null = Null'end as NullCantCompare, case banstatus <> null then'NULL <> NULL'else'NOT NULL <> NULL'end as NullNECompare, case banstatus <=> null then'NULL <=> Null'else 'NOT NULL <=> NULL'end with NULLSafeCompare' – xQbert

+0

爲什麼用戶的ID值是'VARCHAR(50)'?這似乎是錯誤的。通常,您使用「INT AUTO_INCREMENT PRIMARY KEY NOT NULL」類型來連續生成這些數字。 – tadman

回答

3

您插入的值是字符串。 'NULL'是一個字符串,是一個確定的值。要插入NULL你不應該使用引號,例如:

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

DEMO

而且你不能NULL比較,瞭解其意思是像不確定的。雖然,您可以測試一個值是否爲NULL

1

在你的答案中,你將NULL作爲varchar比較,而不是純粹的NULL。

3

您正在使用 'NULL'(字符串)NOT NULL ..所以你比較兩個(相同)字符串

在MySQL中有一個空安全opearator是比較爲真兩空值

<=> 

NULL-safe equal。該運算符與=運算符執行相等比較,但如果兩個操作數均爲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 
+0

他不想匹配他們,他想知道爲什麼他們被匹配。 – Barmar

+0

我刪除了這個問題,否則我可能會收到這個愚蠢的問題downvotes。我沒有注意到'null'是一個字符串。 – Zephyr

+0

答案更新與您的案例的解釋和真正的空值的解決方案......我並沒有看到downvote ..你的問題似乎是一個正確的(並不是很罕見)的問題 – scaisEdge