首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL CASE WHEN 多條件邏輯判斷完全指南

     編輯:MySQL 資料庫相關知識

兩種語法形式

1. 簡單 CASE(值比較)

CASE column_name
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  ...
  ELSE default_result
END

等同於 column_name = value1 等值判斷,適用於枚舉值映射。

2. 搜索 CASE(布爾表達式)

CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ...
  ELSE default_result
END

支持任意比較運算符(>, <, BETWEEN, LIKE, IS NULL 等),靈活性極高。

核心參數說明

子句必選說明
WHEN ... THEN是至少一組,按順序評估,首個 TRUE 即返回對應 RESULT
ELSE否所有 WHEN 均 FALSE 時返回,省略則返回 NULL
END是結束標記

結果類型:所有 THEN 與 ELSE 表達式的最高優先級類型(隱式轉換)。

實戰場景範例

場景一:字段值標準化顯示(簡單 CASE)

SELECT 
  order_id,
  CASE pay_status
    WHEN 0 THEN '待支付'
    WHEN 1 THEN '已支付'
    WHEN 2 THEN '已退款'
    ELSE '未知狀態'
  END AS pay_status_desc
FROM orders;

場景二:數值區間分桶(搜索 CASE)

SELECT 
  product_id,
  price,
  CASE
    WHEN price IS NULL THEN '未定價'
    WHEN price < 50 THEN '低價'
    WHEN price BETWEEN 50 AND 200 THEN '中價'
    WHEN price > 200 THEN '高價'
  END AS price_level
FROM products;

場景三:動態排序/分組(進階用法)

-- 按自定義順序排序
SELECT * FROM products
ORDER BY 
  CASE category
    WHEN 'hot' THEN 1
    WHEN 'new' THEN 2
    ELSE 3
  END, price DESC;

-- 按價格區間分組統計
SELECT 
  CASE
    WHEN price < 100 THEN '<100'
    WHEN price BETWEEN 100 AND 500 THEN '100-500'
    ELSE '>500'
  END AS price_range,
  COUNT(*) AS cnt
FROM products
GROUP BY price_range;

場景四:WHERE 子句動態篩選

SELECT * FROM orders
WHERE 
  CASE 
    WHEN @filter_type = 'status' THEN pay_status = @status_val
    WHEN @filter_type = 'date' THEN create_time > @start_date
    ELSE 1=1
  END;

場景五:字符串替換/標準化

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

避坑指南

  1. 類型一致:所有 THEN/ELSE 返回類型需兼容,否則報錯或隱式轉換導致精度損失
  2. 順序敏感:條件互斥時順序無影響;條件重疊時首個匹配生效,務必按優先級排序
  3. NULL 陷阱:WHEN col = NULL 永遠不匹配,必須用 WHEN col IS NULL
  4. 性能提示:簡單 CASE 可優化為跳表查找;搜索 CASE 需逐條評估,複雜邏輯考慮拆分為多條 SQL 或應用層處理

簡易測試語句

-- 基礎邏輯驗證
SELECT CASE WHEN 10*2=20 THEN '正確' ELSE '錯誤' END;  -- 正確
SELECT CASE 10*2 WHEN 20 THEN '匹配' ELSE '不匹配' END;  -- 匹配

CASE WHEN 是 SQL 中實現業務邏輯分支的瑞士軍刀,掌握兩種語法差異與進階用法,能大幅提升查詢表達力並減少應用層代碼。

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