除了 WHERE 子句,MySQL 還提供 IF()、CASE 運算式,甚至在存儲程序中使用流程控制語句 IF ... THEN ... ELSE ... END IF,實現更靈活的條件邏輯。
語法:IF(condition, true_value, false_value)
-- 將狀態碼轉為可讀文字
SELECT `id`, `name`,
IF(`status` = 1, '啟用', '停用') AS `status_text`
FROM `users`;
兩種語法形式:
SELECT `area_id`,
CASE SUBSTR(`area_id`, 1, 1)
WHEN 'c' THEN (SELECT `country` FROM `country_tbl` WHERE `id` = SUBSTR(`area_id`, 2))
ELSE (SELECT `province` FROM `province_tbl` WHERE `id` = SUBSTR(`area_id`, 2))
END AS `area_name`
FROM `t_ad_area`;
SELECT `score`,
CASE
WHEN `score` >= 90 THEN '優'
WHEN `score` >= 60 THEN '及格'
ELSE '不及格'
END AS `grade`
FROM `exam_results`;
適用於「存在則更新、不存在則插入」(Upsert)邏輯:
DROP PROCEDURE IF EXISTS `upsert_user`;
CREATE PROCEDURE `upsert_user`(
IN p_name VARCHAR(100),
IN p_phone VARCHAR(20),
IN p_email VARCHAR(100)
)
BEGIN
DECLARE v_cnt INT DEFAULT 0;
SELECT COUNT(*) INTO v_cnt FROM `users` WHERE `phone` = p_phone;
IF v_cnt > 0 THEN
UPDATE `users`
SET `name` = p_name, `email` = p_email, `updated_at` = NOW()
WHERE `phone` = p_phone;
ELSE
INSERT INTO `users` (`name`, `phone`, `email`, `created_at`)
VALUES (p_name, p_phone, p_email, NOW());
END IF;
END;
呼叫方式:CALL upsert_user('張三', '0912345678', 'zhang@example.com');
SELECT `id`,
CASE `type`
WHEN 1 THEN `col_a`
WHEN 2 THEN `col_b`
ELSE `col_c`
END AS `dynamic_value`
FROM `multi_type_table`;
IF()、CASE 在 SELECT 清單中執行效率極高,適合報表轉換IF/CASE/LOOP)僅能在 BEGIN ... END 區塊使用善用條件運算式,能讓 SQL 更具表達力,減少應用程式的資料轉換代碼。