處理 NULL

已完成

NULL 值表示「沒有值」或「未知」。 不表示零、空白或甚至空字串。 這些值不是未知。 NULL 值可用來表示尚未提供的值,例如當客戶尚未提供電子郵件地址時。 如您先前所見,如果某個值與目標資料類型不相容,則有些轉換函數也可能會傳回 NULL 值。

您通常需要採取特殊步驟處理 NULL。 NULL 其實不代表任何值, 而代表未知狀態。 其沒有相等的值,也沒有不相等的值。 NULL 不會大於或小於任何值。 我們無法說明這是什麼,但我們有時候會需要使用 NULL 值。 幸好,T-SQL 提供轉換或取代 NULL 值的函數。

ISNULL

ISNULL 函數接受兩個引數。 第一個是我們正在測試的運算式。 如果第一個引數的值為 NULL,則函數會傳回第二個引數。 如果第一個運算式不是 Null,則會原封不動地傳回。

例如,假設資料庫中的 Sales.Customer 資料表包含允許 NULL 值的 MiddleName 資料行。 查詢此資料表時,您可以選擇傳回特定值 (例如 "None"),而不是在結果中傳回 NULL。

SELECT FirstName,
      ISNULL(MiddleName, 'None') AS MiddleIfAny,
      LastName
FROM Sales.Customer;

此查詢的結果如下所示:

FirstName

MiddleIfAny

LastName

Orlando

N.

Gee

Keith

Howard

Donna

F.

Gonzales

...

...

...

注意

用來取代 NULL 的值必須與所要評估運算式具有相同資料類型。 在上述範例中,MiddleNamevarchar,因此取代值不可以是數值。 此外,您必須選擇不會在資料中顯示為一般值的值。 有時候,可能很難找到永遠不會出現在您資料中的值。

上述範例會處理來源資料表中的 NULL 值,但您可搭配任何可能會傳回 NULL 的運算式來使用 ISNULL,包括在 ISNull 函數內巢狀 TRY_CONVERT 函數。

COALESCE

ISNULL 函數不是 ANSI 標準函數,因此您可能會想要改用 COALESCE 函數。 COALESCE 的彈性稍微高些,其所能接受的引數數目為可變,其中每一個都是運算式。 其會傳回清單中非 NULL 的第一個運算式。

如果只有兩個引數,則 COALESCE 的行為會類似於 ISNULL。 不過,如果有兩個以上的引數,則可以使用 COALESCE 替代使用 ISNULL 的多部分 CASE 運算式。

若所有引數皆為 NULL,COALESCE 便會傳回 NULL。 所有運算式都必須傳回相同或相容的資料類型。

語法如下所示:

SELECT COALESCE ( expression1, expression2, [ ,...n ] )

下列範例會使用稱為 HR.Wages 的虛構資料表,其中包含三個資料行,提供員工每週收入的相關資訊:時薪、週薪,以及每售出一單位的佣金。 不過,員工只會收到其中一種款項。 對於每個員工而言,這三個資料行其中一個會有值,其他兩個則為 NULL。 若要判斷支付給每位員工的總金額,您可以使用 COALESCE 只傳回在這三個資料行中找到的非 Null 值。

SELECT EmployeeID,
      COALESCE(HourlyRate * 40,
                WeeklySalary,
                Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;

結果如下所示:

EmployeeID

WeeklyEarnings

1

899.76

2

1001.00

3

1298.77

...

...

NULLIF

NULLIF 函數可讓您在特定情況下傳回 NULL。 此函數應用在資料清理等領域會很有用,此時您會希望以 NULL 取代空白或預留位置字元。

NULLIF 接受兩個引數,如果相等,則會傳回 NULL。 如果不相等,則 NULLIF 會傳回第一個引數。

在此範例中,NULLIF 會以 NULL 取代折扣 0。 如果不是 0,則會傳回折扣值:

SELECT SalesOrderID,
      ProductID,
      UnitPrice,
      NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;

結果如下所示:

SalesOrderID

ProductID

UnitPrice

折扣

71774

836

356.898

NULL

71780

988

112.998

0.4

71781

748

818.7

NULL

71781

985

112.998

0.4

...

...

...

...