decode 与 case when

一,DECODE函数

 

其基本语法为:javascript

Sql代码 java

 收藏代码

  1. DECODE(value, if1, then1, if2, then2, if3, then3,...ifn, thenn, else)  

表示若是value等于if1时,DECODE函数的结果返回then1,...,若是不等于任何一个if值,则返回else。亦即:decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)app

延伸用法:函数

1. 与sign函数联用比较大小:spa

Sql代码  收藏代码翻译

  1. select decode(sign(arg1-arg2),-1, arg1, arg2) from dual; --get arg1与arg2的较小值  

Sql代码  收藏代码code

  1. select decode(sign(3-5),1 ,3, 5) from dual  

 注:sign()函数根据某个值是0、正数仍是负数,分别返回0、一、-1ip

2. 表、视图结构转化:get

基本思路:使用substrb函数实现对字段的判断,而后用decode函数对数据进行从新计算,并生成新的数据和构成新的表(table or view)。flash

二,CASE WHEN

其语法以下:

Sql代码 

 收藏代码

  1. SELECT <myColumnSpec> =   
  2.   CASE WHEN <A> THEN <somethingA>   
  3.      WHEN <B> THEN <somethingB>   
  4.      ELSE <somethingE> END  
  5.    

除了能够在select 中使用CASE 外,where 子句,group by 子句,order by 子句均可以使用

Sql代码 

 收藏代码

  1. SELECT     CASE           
  2.             WHEN price IS NULL THEN 'Unpriced'           
  3.             WHEN price < 10 THEN 'Bargain'           
  4.             WHEN price BETWEEN 10 and 20 THEN 'Average'           
  5.             ELSE 'Gift to impress relatives'       
  6.            END AS "Range",       
  7.            Title   
  8. FROM titles   
  9. where   
  10.     CASE           
  11.                 WHEN price IS NULL THEN 'Unpriced'           
  12.                 WHEN price < 10 THEN 'Bargain'           
  13.                 WHEN price BETWEEN 10 and 20 THEN 'Average'           
  14.                 ELSE 'Gift to impress relatives'     END in('Average','Bargain')  
  15. GROUP BY     CASE           
  16.                 WHEN price IS NULL THEN 'Unpriced'           
  17.                 WHEN price < 10 THEN 'Bargain'           
  18.                 WHEN price BETWEEN 10 and 20 THEN 'Average'           
  19.                 ELSE 'Gift to impress relatives'     END,       
  20.                 Title   
  21. ORDER BY     CASE           
  22.                 WHEN price IS NULL THEN 'Unpriced'           
  23.                 WHEN price < 10 THEN 'Bargain'           
  24.                 WHEN price BETWEEN 10 and 20 THEN 'Average'           
  25.                 ELSE 'Gift to impress relatives'       
  26.                 END,Title   

 

rm_site_master 表结构:

 

rma_center | name

---------------------------

123              |qw

23                |ASde

45                |sssdf

55                |e3fbg

55555          |adfv

22221          |sdfsfe

4                  |sdfeg

579              |lojgdex

 

 

 

Sql代码 

 收藏代码

  1. select name,  
  2.        CASE           
  3.         WHEN rma_center IS NULL THEN 'Null'           
  4.         WHEN rma_center > 1000 THEN '>1000'           
  5.         WHEN rma_center BETWEEN 30 and 100 THEN '30~100'           
  6.         ELSE 'Gift to impress relatives'     END  AS "RMA CENTER Type"                      
  7. from rm_site_master   
  8. where  CASE           
  9.         WHEN rma_center IS NULL THEN 'Null'           
  10.         WHEN rma_center > 1000 THEN '>1000'           
  11.         WHEN rma_center BETWEEN 30 and 100 THEN '30~100'           
  12.         ELSE 'Gift to impress relatives'     END in('30~100','>1000')  
  13. group by CASE           
  14.         WHEN rma_center IS NULL THEN 'Null'           
  15.         WHEN rma_center > 1000 THEN '>1000'           
  16.         WHEN rma_center BETWEEN 30 and 100 THEN '30~100'           
  17.         ELSE 'Gift to impress relatives'     END,  
  18.         name  
  19. order by CASE           
  20.         WHEN rma_center IS NULL THEN 'Null'           
  21.         WHEN rma_center > 1000 THEN '>1000'           
  22.         WHEN rma_center BETWEEN 30 and 100 THEN '30~100'           
  23.         ELSE 'Gift to impress relatives'     END,  
  24.         name  

 

三,DECODE 与CASE WHEN 的比较

 1,DECODE  Oracle 特有;
 2,CASE WHEN  Oracle ,  SQL Server,  MySQL 均可用;
 3,DECODE 只能用作相等判断,可是能够配合sign函数进行大于,小于,等于的判断,CASE  可用于=,>=,<,<=,<>,is null,is not null 等的判断;

    4,DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活;

相关文章
相关标签/搜索