CASE 语句的语法结构1:

情况一:类似于switch

  1. CASE 表达式
  2. WHEN 1 THEN 结果1或语句1(如果是语句,需要加分号)
  3. WHEN 2 THEN 结果2或语句2(如果是语句,需要加分号)
  4. ...
  5. ELSE 结果n或语句n(如果是语句,需要加分号)
  6. END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

CASE 语句的语法结构2:

情况二:类似于多重if

CASE 
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号) 
... 
ELSE 结果n或语句n(如果是语句,需要加分号) 
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

举例1:基本使用

使用CASE流程控制语句的第1种格式,判断var值等于1、等于2,或者两者都不等。

ELIMITER //
CREATE PROCEDURE test_case1()
BEGIN
    #演示1:case ... when ...then ...
    declare var int default 2;

    case var
        when 1 then select 'var = 1';
        when 2 then select 'var = 2';
        else select 'other value';
    end case;
END //

DELIMITER ;

调用

CALL test_case1();

使用CASE流程控制语句的第2种格式,判断val是否为三位数,二维数,或者一位数。。

DELIMITER //
CREATE PROCEDURE test_case2()
BEGIN
    #演示2:case when ... then ....
    DECLARE var1 INT DEFAULT 10;
    CASE 
    WHEN var1 >= 100 THEN SELECT '三位数';
    WHEN var1 >= 10 THEN SELECT '两位数';
    ELSE SELECT '个数位';
    END CASE;

END //

DELIMITER ;

调用

CALL test_case2();

举例2:声明存储过程“update_salary_by_eid4”,定义IN参数emp_id,输入员工编号。判断该员工薪资如果低于9000元,就更新薪资为9000元;薪资大于等于9000元且低于10000的,但是奖金比例为NULL的,就更新奖金比例为0.01;其他的涨薪100元。

DELIMITER //
CREATE PROCEDURE update_salary_by_eid4(IN emp_id INT)
BEGIN
    #局部变量的声明
    DECLARE emp_sal DOUBLE; #记录员工的工资
    DECLARE bonus DOUBLE; #记录员工的奖金率

    #局部变量的赋值
    SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
    SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;

    CASE
    WHEN emp_sal < 9000 THEN UPDATE employees SET salary = 9000 WHERE employee_id = emp_id;
    WHEN emp_sal < 10000 AND bonus IS NULL THEN UPDATE employees SET commission_pct = 0.01 
                            WHERE employee_id = emp_id;
    ELSE UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
    END CASE;


END //

DELIMITER ;

调用

CALL update_salary_by_eid4(103);
CALL update_salary_by_eid4(104);
CALL update_salary_by_eid4(105);

SELECT *
FROM employees
WHERE employee_id IN (103,104,105);

举例3:声明存储过程update_salary_by_eid5,定义IN参数emp_id,输入员工编号。判断该员工的入职年限,如果是0年,薪资涨50;如果是1年,薪资涨100;如果是2年,薪资涨200;如果是3年,薪资涨300;如果是4年,薪资涨400;其他的涨薪500。

DELIMITER //

CREATE PROCEDURE update_salary_by_eid5(IN emp_id INT)
BEGIN
    #声明局部变量
    DECLARE hire_year INT; #记录员工入职公司的总时间(单位:年)

    #赋值
    SELECT ROUND(DATEDIFF(CURDATE(),hire_date) / 365) INTO hire_year 
    FROM employees WHERE employee_id = emp_id;

    #判断
    CASE hire_year
        WHEN 0 THEN UPDATE employees SET salary = salary + 50 WHERE employee_id = emp_id;
        WHEN 1 THEN UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
        WHEN 2 THEN UPDATE employees SET salary = salary + 200 WHERE employee_id = emp_id;
        WHEN 3 THEN UPDATE employees SET salary = salary + 300 WHERE employee_id = emp_id;
        WHEN 4 THEN UPDATE employees SET salary = salary + 400 WHERE employee_id = emp_id;
        ELSE UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
    END CASE;
END //

DELIMITER ;

调用

CALL update_salary_by_eid5(101);

SELECT *
FROM employees

DROP PROCEDURE update_salary_by_eid5;