ISNULL 是 SQL Server 處理空值最常用的函數,但許多開發者混淆了它與標準 SQL COALESCE、邏輯判斷 IS NULL 的差異。本文透過實例釐清用法陷阱,示範正確的空值處理模式。
ISNULL ( check_expression , replacement_value )
SELECT ISNULL(LastChanged, '') AS LastChanged FROM vhHostList WHERE S_Comment = 'test202';
若 LastChanged 為 NULL,結果顯示空字串 '';否則顯示原值。
錯誤寫法 (ASP/VB 經典案例):
' 訂單狀態欄位:NULL=未審核,非 NULL=已審核
If rs("Status") <> "" Then
Response.Write "已審"
Else
Response.Write "審核"
End If
問題:
rs("Status") <> "" 無法區分 NULL、''、' '、'0' 等非空但非預期值。-- 查詢時統一將 NULL 轉為空字串
SELECT
OrderId,
ISNULL(Status, '') AS Status -- NULL → ''
FROM Orders
WHERE ...
前端即可單純判斷:
If rs("Status") = "" Then
' 未審核:顯示審核連結
Else
' 已審核:顯示狀態文字
End If
| 特性 | ISNULL | COALESCE | CASE |
|---|---|---|---|
| 參數數量 | 固定 2 個 | 1~N 個 | 彈性 |
| 標準相容性 | T-SQL 專有 | ANSI SQL 標準 | ANSI SQL 標準 |
| 回傳型別優先序 | 第一參數型別 | 所有參數最高優先序 | 所有分支最高優先序 |
| 效能 | 略優(內建函數) | 略低(轉為 CASE) | 基準 |
| 可攜性 | 僅 SQL Server | 跨資料庫 | 跨資料庫 |
ISNULL,簡潔高效。COALESCE(col1, col2, col3, 'default')。CASE WHEN col IS NULL THEN ... ELSE ... END。NOT NULL DEFAULT '' 或 DEFAULT 0,從源頭消除 NULL 處理負擔。