萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 條件查詢進階:IF、CASE 運算式與存儲程序實戰範例

除了 WHERE 子句,MySQL 還提供 IF()、CASE 運算式,甚至在存儲程序中使用流程控制語句 IF ... THEN ... ELSE ... END IF,實現更靈活的條件邏輯。

一、IF() 函數:單行條件判斷

語法:IF(condition, true_value, false_value)

-- 將狀態碼轉為可讀文字
SELECT `id`, `name`,
       IF(`status` = 1, '啟用', '停用') AS `status_text`
FROM `users`;

二、CASE 運算式:多條件分支

兩種語法形式:

1. 簡單 CASE(比較單一運算式)

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`;

2. 搜尋 CASE(評估多個布林運算式)

SELECT `score`,
       CASE
         WHEN `score` >= 90 THEN '優'
         WHEN `score` >= 60 THEN '及格'
         ELSE '不及格'
       END AS `grade`
FROM `exam_results`;

三、存儲程序中的 IF 流程控制

適用於「存在則更新、不存在則插入」(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');

四、CASE 實戰:動態欄位選擇

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 清單中執行效率極高,適合報表轉換
  • 複雜邏輯優先考慮應用層處理,避免 SQL 過度膨脹
  • 存儲程序中的流程控制語句(IF/CASE/LOOP)僅能在 BEGIN ... END 區塊使用

善用條件運算式,能讓 SQL 更具表達力,減少應用程式的資料轉換代碼。

copyright © 萬盛學電腦網 all rights reserved