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

MySQL CASE WHEN 進階用法:字符串替換、條件聚合、動態排序與複雜邏輯構建

     編輯:MySQL 綜合教學

兩種語法形式

-- 1. 簡單 CASE (等值判斷)
CASE expr
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  ELSE default_result
END

-- 2. 搜索 CASE (條件表達式)
CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ELSE default_result
END

實戰場景一:字符串標準化/替換

SELECT name,
       CASE category
         WHEN 'Holiday'     THEN 'Seasonal'
         WHEN 'Profession'  THEN 'Bi_annual'
         WHEN 'Literary'    THEN 'Random'
         ELSE 'Unknown'
       END AS pattern
FROM sales;

輸出:將業務分類代碼轉換為報表友好標籤。

實戰場景二:條件聚合(單掃描多統計)

SELECT 
  SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) AS excellent,
  SUM(CASE WHEN score >= 60 AND score < 90 THEN 1 ELSE 0 END) AS pass,
  SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS fail,
  AVG(CASE WHEN score >= 60 THEN score END) AS pass_avg
FROM exam;

優勢: 一次全表掃描完成多維統計,避免多次 UNION 或子查詢。

實戰場景三:動態排序

-- 前端傳入 sort_by=name|score, sort_order=asc|desc
ORDER BY 
  CASE WHEN @sort_by = 'name' AND @sort_order = 'asc'  THEN name END ASC,
  CASE WHEN @sort_by = 'name' AND @sort_order = 'desc' THEN name END DESC,
  CASE WHEN @sort_by = 'score' AND @sort_order = 'asc' THEN score END ASC,
  CASE WHEN @sort_by = 'score' AND @sort_order = 'desc' THEN score END DESC;

實戰場景四:複雜業務規則編碼

-- 會員等級判定
SELECT user_id,
       CASE
         WHEN total_amount >= 100000 AND order_count >= 50 THEN 'Diamond'
         WHEN total_amount >= 50000  AND order_count >= 20 THEN 'Platinum'
         WHEN total_amount >= 10000  AND order_count >= 5  THEN 'Gold'
         WHEN total_amount >= 1000   THEN 'Silver'
         ELSE 'Bronze'
       END AS vip_level
FROM user_stats;

實戰場景五:NULL 安全處理

-- COALESCE/IFNULL 等價寫法
SELECT 
  CASE WHEN col IS NULL THEN 'N/A' ELSE col END AS col_display,
  COALESCE(col, 'N/A') AS col_display2;

性能與優化提示

  • 短路求值:WHEN 子句按順序評估,命中即停止。將高概率條件前置。
  • 類型一致性:所有 THEN / ELSE 返回類型應一致,否則隱式轉換可能導致索引失效或精度損失。
  • 不可用於索引:WHERE CASE ... END = 'value' 無法使用索引,需改寫為 WHERE (cond1 AND val1) OR (cond2 AND val2) ...。
  • 聚合中使用:SUM(CASE WHEN ... THEN 1 ELSE 0 END) 是標準條件計數模式,優化器識別度高。

兼容性備註

  • MySQL 所有版本支持。
  • ELSE 可省略,默認返回 NULL。
  • 嵌套 CASE 支持,但建議邏輯扁平化,超過 3 層考慮拆分視圖或應用層處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved