在公司呆了一段時間,發現真正的利器是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)),