SQL的資料欄位若其值為NULL,則該NULL不會等於NULL

網友猛然看到這篇一定不知道我在講甚麼,甚至會覺得我在唸繞口令。莫急,各位看官且聽我娓娓道來。

先來一段加上Parameters的SQL SELECT,且這個Parameters是有可能為NULL:

SELECT * FROM TABLE WHERE userID = @userID
oCmd.Parameters.Add("@userID", System.Data.SqlDbType.NVarChar, 10).Value = (System.Object) oItem.ID ?? System.DBNull.Value;

讀到這裡我們可能會覺得,這有什麼問題?不就是當輸入的userID等於資料庫的userID欄位時,就可以把該筆資料撈出來。這樣講是沒錯,可是請在想一下下列情境:

我要把userID欄位值為NULL的紀錄,全部都找出來。

這時候你可能會覺得,這簡單啊,就是把上面的程式碼中的oItem.ID使其為NULL,然後就可以從上面的SELECT指令去撈出來了啊,指令並沒有錯誤。但是事實上你錯了,因為NULL不等於NULL。

NULL不等於NULL!!

沒錯,NULL不等於NULL。對SQL Server來說,NULL既然不為任何事物,自然就不可以等於NULL。(這裡的觀念與我們常見程式語言的判定不一樣)

如果你真的讓oItem.ID為NULL去查詢,事實上你找到的資料永遠為零筆。

如何讓欄位可能出現NULL的狀況的查詢條件成立?

你可以選擇這樣寫,來規避掉可能出現NULL不等於NULL的狀況。

SELECT * FROM TABLE WHERE ISNULL(userID, '') = ISNULL(@userID, '')

當然啦,這樣的寫法不盡然都符合當下資料的狀況(例如原本資料中真的會出現有userID是''的情況),但這確實是一種有效解法。如果與原來的資料有出現''空字串的衝突時,或許你應該替代成一個永遠不會出現的字串,例如一個GUID也可以。

MicrosoftSqlServer SqlServer ColumnValue NullIsNotEqualNull