2014-10-04 63 views
3

我有一個包含782,856條記錄的表。該表中有一列PEOPLE_TYPE,它是varchar(20)。我不認爲表格模式很重要,但如果是這樣,我會很樂意發佈它。爲什麼選擇消除varchar比較中的空記錄

它具有這些不同的值(括號爲每種類型的計數):

NULL (782,101) 
ANONYMOUS (1) 
BOARD (530) 
USER (224) 

那麼,爲什麼這樣選擇回報這些結果???

select * from people where PEOPLE_TYPE != 'BOARD' 

這回225行...用戶&匿名....爲什麼不包括我的空...因爲我現在已經進行了文本搜索和空值不能真正比較,以便他們淘汰?

感謝您對我的補救問題的耐心。

+1

NULL是未知。現在,當你甚至不知道它們是什麼時,你怎麼能比較兩件事?現在,想一想你用NULL比較的所有東西。結果對你有意義。 – 2014-10-04 16:04:06

回答

6

NULL是一件奇怪的事情。與任何爲NULL的比較是錯誤的:

NULL = NULL是假的

NULL =什麼是假的

NULL = NULL也是假的!。

你必須說像列是空的,或列不爲空。

您的查詢需要

select * from people where PEOPLE_TYPE != 'BOARD' or PEOPLE_TYPE is null 
+1

或者,我最喜歡的,其中IsNull(PEOPLE_TYPE,'')!='BOARD'' – rolfl 2014-10-04 15:32:51

+0

事實上 - 我沒有提到它,因爲isnull是SQL Server,我想使它成爲一個普通的答案。歡呼 - – 2014-10-04 15:34:08

+0

不要太多勞動,但問題是標記爲sql-server,只有mysql沒有做好IsNull,並且您應該指出,如果在任何其他條件下使用括號,則在您的版本中需要括號,因爲'要麼'。 – rolfl 2014-10-04 15:36:02

1

可以,爲什麼不被返回了NULL記錄閱讀詳細信息:與空http://msdn.microsoft.com/en-us/library/ms188048.aspx

如果你想記錄要返回你需要寫這樣的查詢:

select * from people where ISNULL(PEOPLE_TYPE, '0') != 'BOARD' 

或者這樣:

select * from people where PEOPLE_TYPE != 'BOARD' OR PEOPLE_TYPE IS NULL