萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

SQL IIF 函數與 CASE 表達式:條件邏輯的兩種寫法與效能真相

從 Access 遷移到 SQL Server 的條件表達式選型指南

`IIF` 是 Access/VB 系函數,SQL Server 2012+ 才引入以兼容遷移。原生 **CASE 表達式** 才是 T-SQL 標準寫法。本文對比兩者語法、效能與最佳實踐。

語法對比

-- IIF (SQL Server 2012+)
IIF(condition, true_value, false_value)

-- CASE 簡單形式
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default_result END

-- CASE 搜尋形式 (最通用)
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default_result END

實戰範例:統計金額大於 0 的筆數

-- IIF 寫法
SELECT SUM(IIF(Amount > 0, 1, 0)) AS cnt FROM Fees;

-- CASE 寫法 (標準 SQL,所有版本支援)
SELECT SUM(CASE WHEN Amount > 0 THEN 1 ELSE 0 END) AS cnt FROM Fees;

字串函數對照表 (Access → SQL Server)

Access / VBSQL Server (T-SQL)備註
IIF(cond, t, f)CASE WHEN cond THEN t ELSE f ENDIIF 2012+ 才支援
Mid(str, start, len)SUBSTRING(str, start, len)起始位置皆從 1 算
Left(str, len)LEFT(str, len)語法相同
Right(str, len)RIGHT(str, len)語法相同
Len(str)LEN(str)語法相同
InStr([start,] str1, str2)CHARINDEX(str2, str1 [, start])參數順序不同
Replace(str, old, new)REPLACE(str, old, new)語法相同
Format(date, fmt)FORMAT(date, fmt) (2012+) / CONVERTFORMAT 較慢,大量用 CONVERT

效能真相

  • 執行計畫完全相同:查詢優化器將 IIF 內部轉換為 CASE,無任何效能差異。
  • 可讀性與可攜性:CASE 是 ANSI SQL 標準,跨資料庫 (PostgreSQL, Oracle, MySQL) 通用;IIF 僅限 SQL Server/Access。
  • 巢狀深度:CASE 支援多 WHEN 分支,IIF 巢狀超過 10 層會報錯 (限制 10 層)。

最佳實踐建議

  1. **新代碼一律用 CASE**,尤其搜尋形式 `CASE WHEN ... THEN ... ELSE ... END` 最清晰
  2. 遷移 Access 代碼時,批次替換 IIF 為 CASE,順便檢查邏輯
  3. 簡單單值轉換 (如 `IIF(col IS NULL, 0, col)`) 可用 `ISNULL(col, 0)` 或 `COALESCE(col, 0)` 更簡潔
  4. WHERE 子句中**避免**在欄位上用函數/CASE,導致索引失效;改寫為 SARGable 條件
copyright © 萬盛學電腦網 all rights reserved