首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL ISNULL 函數完全指南:語法、跨庫對比、實戰陷阱與 COALESCE 選擇

     編輯:關於SqlServer

ISNULL 核心語法

ISNULL(check_expression, replacement_value)
  • check_expression:被檢查表達式,任意類型。
  • replacement_value:check_expression 為 NULL 時返回的值,**必須隱式轉換為與 check_expression 相同類型**。
  • 返回類型 = check_expression 的類型(優先級較高類型勝出)。

經典示例

1. 配合聚合函數處理 NULL

-- 將 price 為 NULL 的書按 $10 計算平均價
SELECT AVG(ISNULL(price, 10.00)) FROM titles;

2. 顯示層面替換 NULL

SELECT SUBSTRING(title,1,15) AS Title, type AS Type,
       ISNULL(price, 0.00) AS Price
FROM titles;

跨數據庫 NULL 處理函數對比

數據庫函數語法備註
SQL Server / MS AccessISNULL(expr, val)兩參數,類型跟隨第一參數專有
OracleNVL(expr, val)兩參數,類型跟隨第一參數標準 SQL 擴展
MySQLIFNULL(expr, val)兩參數,類型跟隨第一參數同 ISNULL
標準 SQL / PostgreSQL / SQLite / SQL ServerCOALESCE(expr1, expr2, ...)多參數,返回第一個非 NULL**ANSI 標準,推薦跨庫專案優先使用**

實戰陷阱:類型優先級導致的截斷/溢出

-- 陷阱:replacement_value 類型優先級高,導致 check_expression 隱式轉換溢出
DECLARE @v VARCHAR(3) = NULL;
SELECT ISNULL(@v, 12345);  -- 錯誤:VARCHAR(3) 無法容納 12345

-- 正確:顯式轉換 replacement_value
SELECT ISNULL(@v, CAST(12345 AS VARCHAR(10)));

ISNULL vs COALESCE 選擇指南

場景推薦理由
僅兩參數、SQL Server 專用項目ISNULL語法簡短、解析略快、類型規則明確
跨庫遷移、可能擴展多參數、需 ANSI 標準COALESCE標準兼容、支持 N 參數、類型推導按優先級
CASE 表達式替代(如多條件分支)COALESCECOALESCE(a,b,c) 等價於 CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ELSE c END

性能微差異

  • ISNULL 為內建函數,編譯時直接內聯,極高頻調用(百萬級/秒)略快 ~1-2%。
  • COALESCE 會被解析器重寫為 CASE 表達式,增加極微小開銷,可忽略不計。

結語

ISNULL 是 SQL Server 專用的「雙參數 NULL 替換」,簡潔高效;COALESCE 是「多參數、跨平台、標準化」的通用選擇。新項目建議統一 COALESCE,舊代碼維護沿用 ISNULL 即可,無需強行重構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved