Oracle Case When


--測試數據准備

-- 建表  
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函數功能測試--------------------------------------------------------

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM