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

SQL CASE WHEN 進階用法:WHERE 子句條件計算與 SELECT 動態列生成

     編輯:MySQL 綜合教學

SQL CASE WHEN 進階用法:WHERE 子句條件計算與 SELECT 動態列生成

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

場景一:WHERE 子句中統計滿足條件的列數

需求:查詢 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。

場景二:SELECT 動態生成顯示列

需求: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 WHEN 結果

兩種語法形式對比

形式語法適用場景
簡單 CASECASE col WHEN val1 THEN r1 WHEN val2 THEN r2 ELSE r3 END單列等值匹配多值分支,代碼更簡潔
搜索 CASECASE WHEN cond1 THEN r1 WHEN cond2 THEN r2 ELSE r3 END複雜條件(范圍、多列組合、LIKE 等),通用性強

本文兩例均屬搜索 CASE 形式。

性能與可讀性提示

  1. 索引無法直接用於 CASE 表達式:WHERE CASE WHEN a=1 THEN 1 ELSE 0 END = 1 會全表掃描。若高頻查詢,考慮生成列 + 索引(5.7+)或應用層預計算。
  2. 嵌套層級過深(>10 層)影響解析器性能,重構為查找表 JOIN 或應用層邏輯。
  3. ELSE 子句建議保留:避免隱式返回 NULL 導致下游邏輯異常。

CASE WHEN 讓 SQL 擁有了「類編程語言」的分支能力,善用它能將複雜業務規則下推到數據庫層,減少應用層數據傳輸與處理。

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