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

SQL Server CASE 表達式完全指南:簡單/搜尋兩種形式、求值順序與常見陷阱

     編輯:關於SqlServer

兩種語法形式

-- 1. 簡單 CASE:等值比較
CASE sex 
    WHEN '1' THEN '男' 
    WHEN '2' THEN '女' 
    ELSE '其他' 
END

-- 2. 搜尋 CASE:布林表達式(更靈活)
CASE 
    WHEN sex = '1' THEN '男' 
    WHEN sex = '2' THEN '女' 
    ELSE '其他' 
END

核心特性

  • 順序求值:從第一個 WHEN 開始,首個滿足條件即返回,後續分支被忽略
  • 返回類型:所有 THEN/ELSE 結果隱式轉換為最高優先級類型
  • ELSE 缺省:無 ELSE 且無匹配時返回 NULL
  • 可嵌套:THEN/ELSE 中可再包含 CASE

實戰場景

-- 條件分組統計
SELECT 
    CASE 
        WHEN Score >= 90 THEN '優秀'
        WHEN Score >= 80 THEN '良好'
        WHEN Score >= 60 THEN '及格'
        ELSE '不及格'
    END AS Grade,
    COUNT(*) AS Cnt
FROM Students
GROUP BY 
    CASE 
        WHEN Score >= 90 THEN '優秀'
        WHEN Score >= 80 THEN '良好'
        WHEN Score >= 60 THEN '及格'
        ELSE '不及格'
    END;

-- 動態排序
ORDER BY 
    CASE @SortBy 
        WHEN 'Name' THEN FirstName 
        WHEN 'Date' THEN CONVERT(VARCHAR, BirthDate, 112) 
    END;

-- 防除零
SELECT Amount / NULLIF(Quantity, 0) AS UnitPrice;

常見陷阱

  1. 類型衝突:THEN '文字' ELSE 123 END → 錯誤,需顯式 CAST
  2. 2. 條件順序:範圍判斷必須從嚴格到寬鬆(如 ≥90 在 ≥80 前) 3. 簡單 CASE 無法寫複雜條件:需用搜尋 CASE 4. 聚合中不能直接引用別名:GROUP BY 必須重寫完整 CASE

IIF / CHOOSE 簡化替代 (SQL 2012+)

-- IIF:三元運算符
SELECT IIF(Sex = '1', '男', '女') FROM Users;

-- CHOOSE:索引選擇
SELECT CHOOSE(Month, '一月','二月','三月'...) FROM Dates;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved