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

MySQL 條件查詢與流程控制:IF、CASE、WHERE 進階用法

     編輯:MySQL 資料庫相關知識

MySQL 提供豐富的條件表達式與流程控制函數,可在查詢、存儲過程中實現複雜業務邏輯。本文系統整理 WHERE 進階條件、IF() 函數、CASE 表達式及存儲過程 IF/CASE 語句的語法與場景。

一、WHERE 條件進階技巧

1. 日期區間動態計算

-- 以 2011-04-20 為基準,前後各 5 天
SELECT * FROM news
WHERE DATE(adddate) BETWEEN '2011-04-20' - INTERVAL 5 DAY
                        AND '2011-04-20' + INTERVAL 5 DAY;

2. 離散值集合匹配

SELECT * FROM news
WHERE DATE(adddate) IN ('2011-04-20','2011-04-15','2011-04-25');

二、IF() 函數:單值條件返回

語法: IF(condition, true_value, false_value)

SELECT id, name, IF(score >= 60, '及格', '不及格') AS result FROM exam;

適用於 SELECT 列表、WHERE、ORDER BY 等表達式上下文。

三、CASE 表達式:多條件分支

MySQL 支持兩種語法形式:

1. 簡單 CASE(值比較)

CASE expr
  WHEN val1 THEN result1
  WHEN val2 THEN result2
  ELSE default_result
END

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

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

實戰範例:區域代碼解析

SELECT
  SUBSTR(t1.area_id, 1, 1) AS type,
  SUBSTR(t1.area_id, 2) AS id,
  CASE SUBSTR(t1.area_id, 1, 1)
    WHEN 'c' THEN (SELECT t2.country FROM country t2 WHERE t2.id = SUBSTR(t1.area_id, 2))
    ELSE (SELECT DISTINCT t3.province FROM province t3 WHERE t3.id = SUBSTR(t1.area_id, 2))
  END AS name
FROM t_ad_area t1;

交互式測試

mysql> SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;  -- 'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;                  -- 'true'
mysql> SELECT CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;        -- NULL (大小寫敏感)

四、存儲過程中的流程控制語句

在 BEGIN ... END 塊中使用 IF ... THEN ... ELSE ... END IF; 與 CASE ... END CASE; 控制執行流程。

範例:UPSERT(存在更新、不存在插入)

DROP PROCEDURE IF EXISTS upsert_user;
CREATE PROCEDURE upsert_user(
  IN p_name VARCHAR(100), IN p_phone VARCHAR(100), IN p_mac VARCHAR(100)
)
BEGIN
  DECLARE v_cnt INT DEFAULT 0;
  SELECT COUNT(*) INTO v_cnt FROM user_table WHERE mac = p_mac;

  IF v_cnt > 0 THEN
    UPDATE user_table
       SET name = p_name, phone = p_phone, heart = heart + 1
     WHERE mac = p_mac;
  ELSE
    INSERT INTO user_table (name, phone, mac, heart) VALUES (p_name, p_phone, p_mac, 1);
  END IF;
END;

五、效能與可讀性建議

  • 能用 CASE/IF 解決的邏輯,盡量在 SQL 層完成,減少應用層往返。
  • 避免在 WHERE 中對列使用函數(如 DATE(adddate)),導致索引失效;改用 adddate BETWEEN ...。
  • 存儲過程邏輯過重時,考慮下沉到應用層(事務邊界更清晰、易測試、易版本控制)。
  • CASE 表達式優先於多層嵌套 IF(),可讀性與維護性更強。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved