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

SQL Server CASE 表達式實戰:依條件邏輯動態回傳值

     編輯:關於SqlServer

前言

CASE 表達式是 T-SQL 中實現條件邏輯的核心工具,可在 SELECT、WHERE、ORDER BY、SET 等子句中使用。本文透過實例示範簡單與搜尋兩種 CASE 形式,並說明資料型別優先順序與常見陷阱。

兩種語法形式

1. 簡單 CASE 表達式

比較單一運算式與一組 WHEN 值是否相等。

CASE 輸入運算式
    WHEN 比較值1 THEN 結果1
    WHEN 比較值2 THEN 結果2
    ...
    ELSE 預設結果
END

2. 搜尋 CASE 表達式

評估一組獨立的布林運算式,彈性較高。

CASE
    WHEN 布林運算式1 THEN 結果1
    WHEN 布林運算式2 THEN 結果2
    ...
    ELSE 預設結果
END

實戰範例:產品分類代碼轉換為名稱

USE TSQLFundamentals2008;
GO

SELECT 
    productid,
    productname,
    categoryid,
    CASE categoryid
        WHEN 1 THEN N'飲料'
        WHEN 2 THEN N'調味品'
        WHEN 3 THEN N'乳製品'
        WHEN 4 THEN N'糖果點心'
        WHEN 5 THEN N'穀類麥片'
        WHEN 6 THEN N'肉禽類'
        WHEN 7 THEN N'農產品'
        WHEN 8 THEN N'海產品'
        ELSE N'未知分類'
    END AS categoryname
FROM Production.Products;

查詢結果示意

productidproductnamecategoryidcategoryname
1Chai1飲料
2Chang1飲料
3Aniseed Syrup2調味品
4Chef Anton's Cajun Seasoning2調味品
5Chef Anton's Gumbo Mix2調味品
............

進階應用場景

1. 動態排序

DECLARE @SortBy VARCHAR(20) = 'PriceDesc';

SELECT *
FROM Products
ORDER BY 
    CASE @SortBy
        WHEN 'PriceAsc'  THEN unitprice
        WHEN 'PriceDesc' THEN -unitprice  -- 數值型別可用負號反轉
        WHEN 'NameAsc'   THEN productname
        ELSE productid
    END;

2. 聚合條件統計

SELECT 
    categoryid,
    COUNT(*) AS 總筆數,
    SUM(CASE WHEN unitprice > 50 THEN 1 ELSE 0 END) AS 高價商品數,
    SUM(CASE WHEN discontinued = 1 THEN 1 ELSE 0 END) AS 已停售數
FROM Products
GROUP BY categoryid;

3. 資料清洗與標準化

UPDATE Customers
SET region = CASE 
    WHEN region IN ('WA', 'Wash.', 'Washington') THEN 'WA'
    WHEN region IN ('CA', 'Calif.', 'California') THEN 'CA'
    ELSE region
END;

4. 防止除零錯誤

SELECT 
    orderid,
    CASE 
        WHEN qty = 0 THEN 0 
        ELSE totalamount / qty 
    END AS 單價
FROM OrderDetails;

資料型別優先順序與隱含轉換

CASE 所有 THEN/ELSE 回傳值必須可隱含轉換為同一資料型別,遵循資料型別優先順序(高優先順序勝出)。常見錯誤:

-- 錯誤:混合字串與數值
CASE WHEN col = 1 THEN '一' ELSE 2 END  -- 2 會被轉為 '2',但若 ELSE 是日期則會轉換失敗

-- 正確:統一為字串
CASE WHEN col = 1 THEN '一' ELSE '二' END

最佳實務檢核表

  • [ ] 永遠包含 ELSE 子句(預設回傳 NULL 易導致下游邏輯錯誤)。
  • [ ] 確認所有回傳分支資料型別相容。
  • [ ] 簡單比較用「簡單 CASE」,複合條件用「搜尋 CASE」。
  • [ ] WHEN 子句順序即評估順序,將高頻率命中條件前置可微幅提升效能。
  • [ ] 巢狀 CASE 層級過深(> 10)考慮重構為查詢表或函數。

結論

CASE 表達式是 T-SQL 中最靈活的條件邏輯工具,善用它能將商業規則直接表達在查詢中,減少應用層往返,提升可維護性與效能。

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