CASE column_name
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
等同於 column_name = value1 等值判斷,適用於枚舉值映射。
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 表達式的最高優先級類型(隱式轉換)。
SELECT
order_id,
CASE pay_status
WHEN 0 THEN '待支付'
WHEN 1 THEN '已支付'
WHEN 2 THEN '已退款'
ELSE '未知狀態'
END AS pay_status_desc
FROM orders;
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;
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;
THEN/ELSE 返回類型需兼容,否則報錯或隱式轉換導致精度損失WHEN col = NULL 永遠不匹配,必須用 WHEN col IS NULL-- 基礎邏輯驗證
SELECT CASE WHEN 10*2=20 THEN '正確' ELSE '錯誤' END; -- 正確
SELECT CASE 10*2 WHEN 20 THEN '匹配' ELSE '不匹配' END; -- 匹配
CASE WHEN 是 SQL 中實現業務邏輯分支的瑞士軍刀,掌握兩種語法差異與進階用法,能大幅提升查詢表達力並減少應用層代碼。