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 雖然複雜但更爲靈活;

相關文章
相關標籤/搜索