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

SQL CASE 運算式完整攻略:簡單/搜尋形式、DataGrid 綁定技巧

     編輯:關於SqlServer

兩種語法形式

1. 簡單 CASE 運算式

比較單一運算式與多個 WHEN 值:

SELECT FileID,
       CASE FileStatus
           WHEN 'Y' THEN '已完成'
           WHEN 'N' THEN '未完成'
           ELSE '未知狀態'
       END AS FileStatusDesc
FROM TBFile

2. 搜尋 CASE 運算式

評估一組布林運算式,彈性更高:

SELECT FileID,
       CASE
           WHEN FileStatus = 'Y' THEN '已完成'
           WHEN FileStatus = 'N' THEN '未完成'
           ELSE '未知狀態'
       END AS FileStatusDesc
FROM TBFile

DataGrid/GridView 綁定關鍵技巧

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 層建議改用查詢表/函數/應用層邏輯

效能提示

  • CASE 運算式在查詢最佳化階段通常會被展開,索引可正常使用。
  • 避免在 WHERE 條件中對大量資料列使用複雜 CASE,改用計算欄位+索引或查詢提示。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved