MySQL 提供豐富的條件表達式與流程控制函數,可在查詢、存儲過程中實現複雜業務邏輯。本文系統整理 WHERE 進階條件、IF() 函數、CASE 表達式及存儲過程 IF/CASE 語句的語法與場景。
-- 以 2011-04-20 為基準,前後各 5 天
SELECT * FROM news
WHERE DATE(adddate) BETWEEN '2011-04-20' - INTERVAL 5 DAY
AND '2011-04-20' + INTERVAL 5 DAY;
SELECT * FROM news
WHERE DATE(adddate) IN ('2011-04-20','2011-04-15','2011-04-25');
語法: IF(condition, true_value, false_value)
SELECT id, name, IF(score >= 60, '及格', '不及格') AS result FROM exam;
適用於 SELECT 列表、WHERE、ORDER BY 等表達式上下文。
MySQL 支持兩種語法形式:
CASE expr
WHEN val1 THEN result1
WHEN val2 THEN result2
ELSE default_result
END
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; 控制執行流程。
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;
DATE(adddate)),導致索引失效;改用 adddate BETWEEN ...。CASE 表達式優先於多層嵌套 IF(),可讀性與維護性更強。