--測試數據准備 -- 建表 create table student( stu_id varchar2(4), stu_name varchar2(100), --姓名 sex varchar2(1), --性別 1 男 2 女 0 未知 credit integer default 0 ); -- 插入數據 insert into student (stu_id, stu_name, sex, credit) values ('0001', '大王', '2', '83'); insert into student (stu_id, stu_name, sex, credit) values ('0002', '劉一', '1', '85'); insert into student (stu_id, stu_name, sex, credit) values ('0003', '陳二', '2', '86'); insert into student (stu_id, stu_name, sex, credit) values ('0004', '張三', '0', '77'); insert into student (stu_id, stu_name, sex, credit) values ('0005', '李四', '1', '74'); insert into student (stu_id, stu_name, sex, credit) values ('0006', '王五', '0', '73'); insert into student (stu_id, stu_name, sex, credit) values ('0007', '趙六', '1', '65'); insert into student (stu_id, stu_name, sex, credit) values ('0008', '孫七', '2', '69'); insert into student (stu_id, stu_name, sex, credit) values ('0009', '周八', '2', '79'); insert into student (stu_id, stu_name, sex, credit) values ('0010', '吳九', '1', '55'); insert into student (stu_id, stu_name, sex, credit) values ('0011', '鄭十', '1', '76'); --為了測試數據,沒有控制主鍵唯一性 insert into student (stu_id, stu_name, sex, credit) values ('0001', '大王', '2', '83'); insert into student (stu_id, stu_name, sex, credit) values ('0002', '劉一', '1', '85'); insert into student (stu_id, stu_name, sex, credit) values ('0002', '劉一', '', '85'); commit; --case when 使用表達式確定返回值 --一、casewhen語法--------------------------------- --1.簡單Case函數 select case sex when '1' then '男' when '2' then '女' else '其他' end as sex from student; --2.Case搜索函數 select case when sex = '1' then '男' when sex = '2' then '女' else '其他' end as sex from student; --3.表達式函數和搜索函數比較----------------------------- --搜索函數可以識別到空值 select case when sex is null then '男' when sex = '2' then '女' else '其他' end as sex from student where stu_name = '劉一'; --表達式函數無法識別到空值 select case sex when null then '男' when '2' then '女' else '其他' end as sex from student where stu_name = '劉一'; --3.表達式函數和搜索函數比較----------------------------- --一、casewhen語法--------------------------------- --二、Case函數執行順序,只返回第一個符合條件的值,剩下的Case部分將會被自動忽略 --①有排序關系的,可以按照升序關系排序 select stu_id, credit, case when credit < 80 then '良好' when credit < 100 then '優秀' end from student; --② 使用降序排序永遠也不可能得到想要的結果,也可以說這種寫法是錯誤的 select stu_id,credit, case when credit < 100 then '優秀' when credit < 80 then '良好' end from student; --③ ①寫法等價於③,②是一個錯誤的例子 select stu_id,credit, case when credit < 100 and credit >= 80 then '優秀' when credit < 80 then '良好' end from student; --二、Case函數執行順序,只返回第一個符合條件的值,剩下的Case部分將會被自動忽略 --三、case函數功能測試-------------------------------------------------------- --1.放在select中統計某一大類下面的另一個分類下的數據--------------- select credit, count(case when sex = 1 then 1 else null end) 男生數, count(case when sex = 2 THEN 1 else null end) 女生數 from student group by credit; --1.放在select中統計某一大類下面的另一個分類下的數據--------------- --2.放在where中對某一類信息作出限制------------ select * from student where (case when sex = 1 then '性別明確' when sex = 2 THEN '性別明確' else '性別不明確' end) = '性別不明確'; --2.放在where中對某一類信息作出限制------------ --3.放在group by后面對某一類信息進行分類------------------------- select case when credit < 80 then '良好' when credit < 100 then '優秀' end distinction, count(*) from student group by case when credit < 80 then '良好' when credit < 100 then '優秀' end; --3.放在group by后面對某一類信息進行分類------------------------- --三、case函數功能測試--------------------------------------------------------