來自MySQL觸發器里的流程控制語句 知識。
MySQL 的 case when 的語法有兩種:
- 簡單函數
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
- 搜索函數
CASE WHEN [expr] THEN [result1]…ELSE [default] END
這兩種語法有什么區別呢?
簡單函數
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
: 枚舉這個字段所有可能的值*
SELECT NAME '英雄', CASE NAME WHEN '德萊文' THEN '斧子' WHEN '德瑪西亞-蓋倫' THEN '大寶劍' WHEN '暗夜獵手-VN' THEN '弩' ELSE '無' END '裝備' FROM user_info;
SELECT NAME '英雄', CASE NAME WHEN '德萊文' THEN '斧子' WHEN '德瑪西亞-蓋倫' THEN '大寶劍' WHEN '暗夜獵手-VN' THEN '弩' ELSE '無' END '裝備' FROM user_info;
搜索函數
CASE WHEN [expr] THEN [result1]…ELSE [default] END
:搜索函數可以寫判斷,並且搜索函數只會返回第一個符合條件的值,其他case
被忽略
# when 表達式中可以使用 and 連接條件 SELECT NAME '英雄', age '年齡', CASE WHEN age < 18 THEN '少年' WHEN age < 30 THEN '青年' WHEN age >= 30 AND age < 50 THEN '中年' ELSE '老年' END '狀態' FROM user_info;
聚合函數 sum 配合 case when 的簡單函數實現行轉列 SELECT st.stu_id '學號', st.stu_name '姓名', sum( CASE co.course_name WHEN '大學語文' THEN sc.scores ELSE 0 END ) '大學語文', sum( CASE co.course_name WHEN '新視野英語' THEN sc.scores ELSE 0 END ) '新視野英語', sum( CASE co.course_name WHEN '離散數學' THEN sc.scores ELSE 0 END ) '離散數學', sum( CASE co.course_name WHEN '概率論與數理統計' THEN sc.scores ELSE 0 END ) '概率論與數理統計', sum( CASE co.course_name WHEN '線性代數' THEN sc.scores ELSE 0 END ) '線性代數', sum( CASE co.course_name WHEN '高等數學' THEN sc.scores ELSE 0 END ) '高等數學' FROM edu_student st LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id LEFT JOIN edu_courses co ON co.course_no = sc.course_no GROUP BY st.stu_id ORDER BY NULL;
行轉列測試數據
-- 創建表 學生表 CREATE TABLE `edu_student` ( `stu_id` VARCHAR (16) NOT NULL COMMENT '學號', `stu_name` VARCHAR (20) NOT NULL COMMENT '學生姓名', PRIMARY KEY (`stu_id`) ) COMMENT = '學生表' ENGINE = INNODB; -- 課程表 CREATE TABLE `edu_courses` ( `course_no` VARCHAR (20) NOT NULL COMMENT '課程編號', `course_name` VARCHAR (100) NOT NULL COMMENT '課程名稱', PRIMARY KEY (`course_no`) ) COMMENT = '課程表' ENGINE = INNODB; -- 成績表 CREATE TABLE `edu_score` ( `stu_id` VARCHAR (16) NOT NULL COMMENT '學號', `course_no` VARCHAR (20) NOT NULL COMMENT '課程編號', `scores` FLOAT NULL DEFAULT NULL COMMENT '得分', PRIMARY KEY (`stu_id`, `course_no`) ) COMMENT = '成績表' ENGINE = INNODB; -- 插入數據 -- 學生表數據 INSERT INTO edu_student (stu_id, stu_name) VALUES ('1001', '盲僧'), ('1002', '趙信'), ('1003', '皇子'), ('1004', '寒冰'), ('1005', '蠻王'), ('1006', '狐狸'); -- 課程表數據 INSERT INTO edu_courses (course_no, course_name) VALUES ('C001', '大學語文'), ('C002', '新視野英語'), ('C003', '離散數學'), ( 'C004', '概率論與數理統計' ), ('C005', '線性代數'), ('C006', '高等數學'); -- 成績表數據 INSERT INTO edu_score (stu_id, course_no, scores) VALUES ('1001', 'C001', 67), ('1002', 'C001', 68), ('1003', 'C001', 69), ('1004', 'C001', 70), ('1005', 'C001', 71), ('1006', 'C001', 72), ('1001', 'C002', 87), ('1002', 'C002', 88), ('1003', 'C002', 89), ('1004', 'C002', 90), ('1005', 'C002', 91), ('1006', 'C002', 92), ('1001', 'C003', 83), ('1002', 'C003', 84), ('1003', 'C003', 85), ('1004', 'C003', 86), ('1005', 'C003', 87), ('1006', 'C003', 88), ('1001', 'C004', 88), ('1002', 'C004', 89), ('1003', 'C004', 90), ('1004', 'C004', 91), ('1005', 'C004', 92), ('1006', 'C004', 93), ('1001', 'C005', 77), ('1002', 'C005', 78), ('1003', 'C005', 79);