CASE WHEN 是 SQL 中實現「行級邏輯判斷」的核心工具。本文通過建表測試數據,演示兩大高頻場景:WHERE 子句中多條件計數過濾、SELECT 列中動態映射輸出。
CREATE TABLE `hello`.`sometbl` (
`id` INT NOT NULL AUTO_INCREMENT,
`a` VARCHAR(45) NULL,
`b` VARCHAR(45) NULL,
`c` VARCHAR(45) NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `hello`.`sometbl` (`a`, `b`, `c`) VALUES ('1', '1', '0');
INSERT INTO `hello`.`sometbl` (`b`, `c`) VALUES ('1', '1'); -- a=NULL
INSERT INTO `hello`.`sometbl` (`a`, `c`) VALUES ('1', '1'); -- b=NULL
INSERT INTO `hello`.`sometbl` (`b`) VALUES ('1'); -- a=NULL, c=NULL
需求:查詢 a、b、c 中恰好有兩列值為 '1' 的記錄。
SELECT * FROM hello.sometbl
WHERE (
(CASE WHEN a='1' THEN 1 ELSE 0 END) +
(CASE WHEN b='1' THEN 1 ELSE 0 END) +
(CASE WHEN c='1' THEN 1 ELSE 0 END)
) = 2;
邏輯解析:每列滿足條件計 1,不滿足計 0,求和後與目標值比較。NULL 不等於 '1',自動歸 0。
需求:id=1,2,3,4 時輸出中文數字「一、二、三、四」,其餘輸出「其它」。
SELECT
id,
CASE
WHEN id=1 THEN '一'
WHEN id=2 THEN '二'
WHEN id=3 THEN '三'
WHEN id=4 THEN '四'
ELSE '其它'
END AS chinese_num
FROM hello.sometbl;

| 形式 | 語法 | 適用場景 |
|---|---|---|
| 簡單 CASE | CASE col WHEN val1 THEN r1 WHEN val2 THEN r2 ELSE r3 END | 單列等值匹配多值分支,代碼更簡潔 |
| 搜索 CASE | CASE WHEN cond1 THEN r1 WHEN cond2 THEN r2 ELSE r3 END | 複雜條件(范圍、多列組合、LIKE 等),通用性強 |
本文兩例均屬搜索 CASE 形式。
WHERE CASE WHEN a=1 THEN 1 ELSE 0 END = 1 會全表掃描。若高頻查詢,考慮生成列 + 索引(5.7+)或應用層預計算。CASE WHEN 讓 SQL 擁有了「類編程語言」的分支能力,善用它能將複雜業務規則下推到數據庫層,減少應用層數據傳輸與處理。