Skip to content

流程控制函数


数据库流程函数(Flow Control Functions)主要用于控制 SQL 语句的执行流程,常出现在存储过程(Stored Procedure)、触发器(Trigger)、函数(Function)或脚本中。

用于在 SQL 中实现分支逻辑判断。

IF(条件, 值1, 值2)
  • 功能:如果条件为真返回值1,否则返回值2。

  • 例子

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

类似于 Java 中的 switch 语句,可实现多分支逻辑。

CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 默认结果
END
  • 功能:逐条判断条件并返回匹配的结果。

  • 例子

    SELECT name,
    CASE
    WHEN age < 18 THEN '未成年'
    WHEN age < 60 THEN '成年人'
    ELSE '老年人'
    END AS age_group
    FROM user;
  • 表达式IFNULL(expr1, expr2)

  • 功能:如果 expr1 不为 NULL,就返回 expr1;如果为 NULL,就返回 expr2

常用于处理可能为空的字段,给一个默认值。

  • 例子
SELECT IFNULL(NULL, '默认值'); -- 结果: 默认值
SELECT IFNULL('abc', '默认值'); -- 结果: abc
  • 表达式COALESCE(expr1, expr2, expr3, …)

  • 功能COALESCE(expr1, expr2, ..., exprN) 会依次检查传入的表达式,返回 第一个非 NULL 的值

  • 例子

    SELECT COALESCE(address, temp_address, '未知') FROM user;
NULLIF(expr1, expr2)
  • 功能:若 expr1 = expr2,返回 NULL,否则返回 expr1。

  • 用途:常用于防止除数为 0。

  • 例子

    SELECT score / NULLIF(total, 0) FROM exam;

5. IF / ELSEIF / ELSE(存储过程内使用)

Section titled “5. IF / ELSEIF / ELSE(存储过程内使用)”

在存储过程或触发器中使用多层条件判断。

IF condition1 THEN
语句1;
ELSEIF condition2 THEN
语句2;
ELSE
语句3;
END IF;

用于在条件成立时重复执行语句。

WHILE condition DO
-- 循环体
END WHILE;
  • 例子

    SET i = 1;
    WHILE i <= 10 DO
    INSERT INTO logs VALUES (i, NOW());
    SET i = i + 1;
    END WHILE;

至少执行一次循环体,直到条件为真才退出。

REPEAT
-- 循环体
UNTIL condition
END REPEAT;
  • 无限循环,用 LEAVE 退出。
  • 功能:跳出当前循环。
  • 功能:跳过当前循环的剩余语句,直接进入下一次循环。

例子:

label1: LOOP
SET i = i + 1;
IF i > 10 THEN
LEAVE label1; -- 跳出循环
END IF;
END LOOP label1;

在某些数据库(如 SQL Server)中支持跳转标签。

GOTO label_name;

在 MySQL 存储过程中抛出自定义错误。

SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '自定义错误信息';

例子:

IF total = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '除数不能为0';
END IF;

在存储函数中返回一个结果。

RETURN expression;