我們都知道SQL Server中NULL是一個很特殊的存在,因為NULL不會等於任何值,且NULL也不會不等於任何值。對於NULL我們只能使用IS或IS NOT關鍵字來進行比較。
我們先來看看下面一個SQL查詢,由於NULL不會等於任何值,所以毫無疑問下面的查詢會返回0:
SELECT CASE WHEN NULL=1 THEN 1 ELSE 0 END
輸出結果:
那么如果我們在上面查詢的基礎上,給判斷條件NULL=1前加上NOT關鍵字效果如何呢?如下所示:
SELECT CASE WHEN NOT NULL=1 THEN 1 ELSE 0 END
輸出結果:
我們可以看到輸出還是0,有些同學可能會覺得很奇怪,判斷條件NULL=1不是返回False嗎,那么NOT NULL=1應該返回True才對啊?那么我們試試在判斷條件NULL=1前加兩個NOT關鍵字試試:
SELECT CASE WHEN NOT NOT NULL=1 THEN 1 ELSE 0 END
輸出結果:
結果顯示判斷條件NOT NOT NULL=1,還是返回的False,事實上無論我們在NULL=1前面加多少個NOT關鍵字,判斷條件NOT ... NOT NULL=1都會返回False。
因為我們前面說了NULL不會等於任何值,且NULL也不會不等於任何值,所以除了用IS或IS NOT關鍵字來比較NULL,所有其它比較運算符對NULL進行的比較都是無效的,NULL會讓整個表達式都返回False,所以無論我們在判斷條件NULL=1前面加多少個NOT關鍵字都沒有用,因為整個NOT ... NOT NULL=1表達式都會返回False。
雖然上面我們看到NULL會讓整個判斷表達式都返回False,但是它並不會干擾由OR或AND關鍵字分隔的其它判斷條件,例如:
SELECT CASE WHEN (NOT NOT NULL=1) OR (1=1 AND 2=2) THEN 1 ELSE 0 END
輸出結果: