DECODE函數的用法和實際運用

在公司呆了一段時間,發現真正的利器是sql,要想在企業裏得到大家的認可,有很好的sql編程功底是很重要很重要的,爲了不斷提高自己的sql語句編寫能力,我將不定期堅持寫sql的博客,其中大部分是遇到的問題和解決方案。如果你有幸看到我的文章,也歡迎加入學習討論吧!

公司要要我在原來的報表基礎上加一個“是否壞機返廠”的字段,公司用的數據庫是oracle9i,但是要實現這個字段內容的正確顯示,必須要經過一系列的判斷才能得到是還是否。

下面是我查找的解決sql做判斷的方法:


判斷是否壞機返廠
select sms.series_code,decode(ibs.wh_status,'','否','是')  as isbad from sm_seristatus sms
left join imei_billseries ibs on ibs.series_code = sms.series_code and ibs.wh_status = '壞機返廠'

其中涉及到的表都是和具體業務相關,我只是把語句列出。


DECODE函數是ORACLE PL/SQL是功能強大的函數之一,目前還只有ORACLE公司的SQL提供了此函數,其他數據庫廠商的SQL實現還沒有此功能。

DECODE有什麼用途呢? 

先構造一個例子,假設我們想給智星職員加工資,其標準是:

工資在8000元以下的將加20%;

工資在8000元以上的加15%,

通常的做法是,先選出記錄中的工資字段值? select salary into var-salary from employee,

然後對變量var-salary用if-then-else或choose case之類的流控制語句進行判斷。 如果用DECODE函數,那麼我們就可以把這些流控制語句省略,通過SQL語句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee 是不是很簡潔? DECODE的語法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等於if1時,DECODE函數的結果返回then1,...,如果不等於任何一個if值,則返回else。初看一下,DECODE 只能做等於測試,但剛纔也看到了,我們通過一些函數或計算替代value,是可以使DECODE函數具備大於、小於或等於功能。



  decode()函數使用技巧


  ·軟件環境:


  1、Windows NT4.0+ORACLE 8.0.4


  2、ORACLE安裝路徑爲:C:\ORANT


  ·含義解釋:


  decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)


  該函數的含義如下:


  IF 條件=值1 THEN


  RETURN(翻譯值1)


  ELSIF 條件=值2 THEN


  RETURN(翻譯值2)


  ......


  ELSIF 條件=值n THEN


  RETURN(翻譯值n)


  ELSE


  RETURN(缺省值)


  END IF


  · 使用方法:


  1、比較大小


  select decode(sign(變量1-變量2),-1,變量1,變量2) from dual; --取較小值


  sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1


  例如:


  變量1=10,變量2=20


  則sign(變量1-變量2)返回-1,decode解碼結果爲“變量1”,達到了取較小值的目的。


  2、表、視圖結構轉化


  現有一個商品銷售表sale,表結構爲:


  month    char(6)      --月份


  sell    number(10,2)   --月銷售金額


  現有數據爲:


  200001  1000


  200002  1100


  200003  1200


  200004  1300


  200005  1400


  200006  1500


  200007  1600


  200101  1100


  200202  1200


  200301  1300


  想要轉化爲以下結構的數據:


  year   char(4)      --年份


  month1  number(10,2)   --1月銷售金額


  month2  number(10,2)   --2月銷售金額


  month3  number(10,2)   --3月銷售金額


  month4  number(10,2)   --4月銷售金額


  month5  number(10,2)   --5月銷售金額


  month6  number(10,2)   --6月銷售金額


  month7  number(10,2)   --7月銷售金額


  month8  number(10,2)   --8月銷售金額


  month9  number(10,2)   --9月銷售金額


  month10  number(10,2)   --10月銷售金額


  month11  number(10,2)   --11月銷售金額


  month12  number(10,2)   --12月銷售金額


  結構轉化的SQL語句爲:


  create or replace view


  v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)


  as


  select


  substrb(month,1,4),


  sum(decode(substrb(month,5,2),'01',sell,0)),


  sum(decode(substrb(month,5,2),'02',sell,0)),


  sum(decode(substrb(month,5,2),'03',sell,0)),


  sum(decode(substrb(month,5,2),'04',sell,0)),
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章