NULL 比較搜尋條件

NULL 值表示資料行的資料值為未知或無效的。NULL 並不是零 (數值的或二進位的值)、零長度字串或空白 (字元值) 的同義字。相對的,Null 值可以讓您用來區分零的輸入 (數值的資料行) 或空白 (字元資料行) 以及完全沒有輸入 (NULL 的數值或字元資料行)。

NULL 可以下列兩種方式被輸入到允許 Null 值的資料行中 (在 CREATE TABLE 陳述式中指定):

  • 如果沒有輸入資料,而且資料行或資料類型沒有預設值或 DEFAULT 條件約束,SQL Server 會自動輸入 NULL 值。

  • 使用者只要直接輸入 NULL (不需要引號),就可以明確輸入 NULL 值。如果 NULL 這個字加上引號輸入到字元資料行,會被視為 N、U、L、L 的字母而不是 Null 值。

輸入 Null 值後,應用程式一般會在適當的位置將 Null 值以 NULL 或 (NULL) 或 (null) 來顯示。例如,Product 資料表的 Color 資料行允許 Null 值:

USE AdventureWorks2008R2;
GO
SELECT ProductID, Name, Color
FROM AdventureWorks2008R2.Production.Product
WHERE Color IS NULL

比較 Null 值

比較 Null 值時需要特別注意。比較的行為會根據 SET ANSI_NULLS 選項的設定而有所不同。

當 SET ANSI_NULLS 是 ON 時,比較一個或多個 Null 運算式不會產生 TRUE 或 FALSE 的結果,而會產生 UNKNOWN。這是因為未知的值無法與任何值進行邏輯比較。如果運算式與常值 NULL 比較,或是兩個運算式互相比較但其中有一個是 NULL 值,就會發生此狀況。例如,當 ANSI_NULLS 是 ON 時,下列比較永遠都會產生 UNKNOWN:

ytd_sales > NULL

無論何時只要變數中包含 NULL 值,下列比較也會產生 UNKNOWN:

ytd_sales > @MyVariable

使用 IS NULL 或 IS NOT NULL 子句可以測試是否為 NULL 值。不過這樣會增加 WHERE 子句的複雜度。例如,AdventureWorks2008R2Customer 資料表的 TerritoryID 資料行允許 Null 值。如果 SELECT 陳述式要測試其他資料行是否有 Null 值,必須包含 IS NULL 子句:

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
   OR TerritoryID IS NULL

與 Null 值進行比較時,Transact-SQL 支援允許比較運算子傳回 TRUE 或 FALSE 的延伸模組。將 ANSI_NULLS 設為 OFF 就可以開啟此選項。若 ANSI_NULLS 是 OFF,則當 ColumnA 包含 Null 值,ColumnA = NULL 的比較會傳回 TRUE;而當 ColumnA 包含部分除了 NULL 以外的值,會傳回 FALSE。此外,比較兩個都評估為 NULL 的運算式會傳回 TRUE。ANSI_NULLS 設定不會影響包含 NULL 的聯結資料行。包含 NULL 之聯結資料行中的資料列不屬於結果集的一部分。若 ANSI_NULLS 設為 OFF,下列 SELECT 陳述式會傳回 Customer 資料表中 Region 為 null 值的所有資料列:

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID = NULL

無論 ANSI_NULLS 的設定為何,若有 ORDER BY、GROUP BY 和 DISTINCT 關鍵字出現,null 值永遠都視為相同。同時,允許 NULL 的唯一索引或 UNIQUE 條件約束也可以只包含一個具有 NULL 索引鍵值的資料列。但後續有 NULL 值的資料列則會被拒絕。有索引鍵部分的任何資料行中,主索引鍵不能有 NULL 值。

與 NULL 有關的計算結果必須是 NULL,因為如果其中有任何未知的因素,結果就必須是 UNKNOWN。例如,如果 column1 為 NULL,column1 + 1 就會評估為 NULL。

當搜尋的資料行包含定義允許 Null 值的資料行時,您可以使用下列模式找出資料庫中 Null 或非 Null 的值:

WHERE column_name IS [NOT] NULL

請參閱

參考

概念