比較單一運算式與多個 WHEN 值:
SELECT FileID,
CASE FileStatus
WHEN 'Y' THEN '已完成'
WHEN 'N' THEN '未完成'
ELSE '未知狀態'
END AS FileStatusDesc
FROM TBFile
評估一組布林運算式,彈性更高:
SELECT FileID,
CASE
WHEN FileStatus = 'Y' THEN '已完成'
WHEN FileStatus = 'N' THEN '未完成'
ELSE '未知狀態'
END AS FileStatusDesc
FROM TBFile
ASP.NET 資料繫結控制項要求欄位名稱固定,使用 別名置於 CASE 之前 確保輸出欄位名稱穩定:
-- 錯誤:輸出欄位名稱不固定
SELECT FileID, CASE FileStatus WHEN 'Y' THEN '已完成' ... END FROM TBFile
-- 正確:明確指定輸出欄位名稱
SELECT FileID,
FileStatusDesc = CASE
WHEN FileStatus = 'Y' THEN '已完成'
WHEN FileStatus = 'N' THEN '未完成'
ELSE '未知狀態'
END
FROM TBFile
ORDER BY
CASE @SortBy
WHEN 'Name' THEN LastName
WHEN 'Date' THEN CONVERT(VARCHAR, HireDate, 112)
ELSE EmpID
END
SELECT Department,
SUM(CASE WHEN Gender = 'M' THEN 1 ELSE 0 END) AS MaleCount,
SUM(CASE WHEN Gender = 'F' THEN 1 ELSE 0 END) AS FemaleCount
FROM Employees
GROUP BY Department
UPDATE Orders
SET Status = CASE
WHEN ShipDate IS NOT NULL AND DATEDIFF(day, OrderDate, ShipDate) > 30 THEN '延遲'
WHEN ShipDate IS NOT NULL THEN '已出貨'
WHEN OrderDate < DATEADD(month, -1, GETDATE()) THEN '逾期未處理'
ELSE '處理中'
END
| 錯誤 | 修正 |
|---|---|
| 忘記 END 關鍵字 | 每個 CASE 必須以 END 結尾 |
| 資料型別不一致導致隱性轉換失敗 | 所有 THEN/ELSE 回傳型別應一致,必要時 CAST |
| ELSE 省略導致 NULL 結果 | 明確加上 ELSE 處理預期外數值 |
| 巢狀過深影響可讀性 | 超過 3 層建議改用查詢表/函數/應用層邏輯 |