浅析Oracle之case语句

转自:HTTPS://blog.csdn.net/shangboerds/article/details/41989283

在编程语言中IF ELSE语句用来对过程进行控制,在SQL的世界中CASE语句有类似的效果。下面简单的介绍CASE语句的用法。

CASE语句的形式

首先了解一下CSAE语句的两种形式,简单case语句和查询case语句:

[SQL]   查看纯 字幕: 
  1. 选择  
  2.      - 简单CASE语句(Simple CASE)  
  3.     CASE  GENDER    
  4.         WHEN  1  THEN '男'     
  5.         ELSE '女'     
  6.     END AS  性别,   
  7.   
  8.      - 查询CASE语句(Searched CASE)  
  9.     案件     
  10.          性别= 1  那么'男'     
  11.         ELSE '女'     
  12.     END AS  性别   
  13.       
  14. FROM  USER_INFO;  

接下来我们举例说明case语句的用法。假设有个USER_INFO表,定义如下:

[SQL]   查看纯 字幕:  
  1. CREATE TABLE  USER_INFO   
  2. (  
  3.     NAME         VARCHAR2(20)  NOT NULL ,   ---姓名   
  4.     性别号码(1,0),             ---性别(1,男2,女)  
  5.     BIRTHDAY     DATE ---生日                      
  6. );  
  7.   
  8. INSERT INTO  USER_INFO  VALUES  ('张三' ,1,  DATE '2014年12月27日' );    
  9. INSERT INTO  USER_INFO  VALUES  ('李四' ,2,  DATE '2014年12月27日' );    


CASE使用案例1

把USER_INFO表导出生成一个文件,要求性别为男或女,而不是1和2,怎么办我们可以用如下的语句处理?:

[SQL]   查看纯 字幕:  
  1. 选择   
  2.     NAME ,  
  3.     CASE  GENDER  
  4.         WHEN  1  THEN '男'   
  5.         ELSE '女'   
  6.     END AS  性别,   
  7.     生日  
  8. FROM  USER_INFO;  

CASE使用案例2

假设USER_INFO目前没有值,然后你往USER_INFO导入了一批数据,但是很不幸,错把男设置成为2,而把女设置成为1,现在要求你变换过来,怎么办?

方法1:使用三条语句,先把2更新成3,接着把1更新成2,最后把3更新成1,是不是很麻烦?

[SQL]   查看纯 字幕:  
  1. UPDATE  USER_INFO  SET  GENDER = 3  WHERE  GENDER = 2;  
  2. UPDATE  USER_INFO  SET  GENDER = 1  WHERE  GENDER = 3;  
  3. UPDATE  USER_INFO  SET  GENDER = 2  WHERE  GENDER = 1;  

方法2 :使用CASE语句

[SQL]   查看纯 字幕:  
  1. UPDATE  USER_INFO  SET  GENDER =  
  2. (  
  3.   CASE  GENDER  
  4.     WHEN  1  THEN  2  
  5.     WHEN  2  THEN  1  
  6.     ELSE  GENDER  
  7.   结束  
  8. );  

细心的朋友可能已经发现了,上面的方法1的三条语句的执行顺序有问题,没错,是我故意那些写的,仅仅是把1变成2,把2变成1就那么麻烦,而且很容易出错,想象一下,如果有很多这样的值需要变换,那是一种什么样的情况。还好,我们有CASE语句,有好多这样的值需要变换,CASE语句也不会存在问题。

CASE使用案例3

假设让你把张三的生日更新成1949年10月1日,李四的生日更新成1997年7月1日等,类似这样的更新有很多。该怎么办呢?非常简单,大多数人会这么做。

[SQL]   查看纯 字幕:  
  1. UPDATE  USER_INFO  SET  BIRTHDAY =  DATE '1949年10月1日' WHERE NAME  =  '张三' ;     
  2. UPDATE  USER_INFO  SET  BIRTHDAY =  DATE '1997年7月1日' WHERE NAME  =  '李四' ;     

当USER_INFO表的数据量非常大,而NAME字段上又没有索引时,每条语句都要进行全表扫描,如果这样的语句有很多,效率会非常差,这时候我们可以用CASE语句,如下:

[SQL]   查看纯 字幕:  
  1. UPDATE  USER_INFO  SET  BIRTHDAY =  
  2. (  
  3.   CASE NAME   
  4.     '张三' THEN 日期'1949年10月1日'      
  5.     WHEN '李四' THEN 日期'1997年7月1日'      
  6.     ELSE  BIRTHDAY  
  7.   结束  
  8. )  
  9. WHERE NAME  ('张三' ,'李四' );    

最后,再来回顾一下CASE语句的两种形式,你记住了吗?

[SQL]   查看纯 字幕: 
  1. 选择  
  2.      - 简单CASE语句(Simple CASE)  
  3.     CASE  GENDER    
  4.         WHEN  1  THEN '男'     
  5.         ELSE '女'     
  6.     END AS  性别,   
  7.   
  8.      - 查询CASE语句(Searched CASE)  
  9.     案件     
  10.          性别= 1  那么'男'     
  11.         ELSE '女'     
  12.     END AS  性别   
  13.       
  14. FROM  USER_INFO;  

DECODE函数

此外,甲骨文还提供了一个函数来达到和CASE语句相同的效果。

[SQL]   查看纯 字幕:  
  1. SELECT  DECODE(GENDER,1,  '男' ,2,  '女' ,  '未知' )  FROM  USER_INFO;  

猜你喜欢

转载自blog.csdn.net/Mary19920410/article/details/80670944