含義解釋: 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
含義解釋:
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;? –取較小值
??????? select decode(sign(變量1-變量2), 1或0, 變量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)),
sum(decode(substrb(month,5,2),’05’,sell,0)),
sum(decode(substrb(month,5,2),’06’,sell,0)),
sum(decode(substrb(month,5,2),’07’,sell,0)),
sum(decode(substrb(month,5,2),’08’,sell,0)),
sum(decode(substrb(month,5,2),’09’,sell,0)),
sum(decode(substrb(month,5,2),’10’,sell,0)),
sum(decode(substrb(month,5,2),’11’,sell,0)),
sum(decode(substrb(month,5,2),’12’,sell,0))
from sale
group by substrb(month,1,4);
從month中第5個字節開始取2個字節的值(substrb部分);
然后判斷該值,若該值等于’01’,則取sell列的值, 否則取0值(decode部分);
然后將這些累計求和(sum部分)。
在oracle下,有substrb和substr等2個函數的,取的意義是完全不一樣的,一個是根據字符取,一個是根據字節取。