decode函式在實際開發中非常的有用,而且功能比較強大,與其他函式結合,能讓很多的工作變得簡單;
decode(字段,
條件1,
結果值1,
條件2,
結果值2, …預設值);
該函式的含義如下:
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
例如:select decode(sign(10-20),-1,10,20) from dual;
則sign(變數1-變數2)返回-1,decode解碼結果為「變數1」,達到了取較小值的目的。
2、生成固定位數的序列號
我們看我們的水電煤等各種單子,經常有類似這種 2013000000000004這種固定長度的序列,我們可以結合lpad函式,使主鍵的值自動加1並在前面補0;
select '2013' || lpad(decode(count(id),0,1,max(to_number(id)+1)),12,'0')
記錄編號 from ffm83
ffm83 是一張做測試的表,id是它的流水id,有3條資料;
注意:這種寫法雖然簡單,但是如果使用者多,在高併發情況下,可能會生成同樣的序列號;
如果在高併發的情況下,可以參考下面這種寫法:
select '2013' || lpad(seq_ ffm83.nextval,12,'0')
記錄編號 from ffm83
seq_ ffm83是和ffm83表對應的乙個sequence
3、簡化多個條件的查詢
比如我要查詢男、女生的數量分別是多少?
通常我們這麼寫:
select count(*) from 表 where
性別=男;
select count(*) from 表 where
性別=女;
這樣至少要查詢2次,如果有更加多的選擇的話,那麼資料庫的訪問量會更加多;
用decode呢,只需要一句話
select sum(decode(***,'男',1,0)),sum(decode(***,'女',1,0))
from ffm83
ffm83 表中有乙個***字段,直接放了漢字的男女屬性;
4、在order by中使用decode對指定字段進行排序
按照計算機,數學專業進行排序
例:select * from ffm83 order by decode(subject, '計算機', 1, '數學',
2,10);
執行結果為:
女 1
計算機 2013/1/4
男 2
數學 2013/3/13
女 3
數學 2013/3/18
注意:在大資料量的排序中,盡量不要使用這種方式,資料庫開銷非常大;
5、將豎表轉橫表
我們要統計2023年上半年每個月有多少人,最好直接拉出來一張類似報表的樣子。如果用常規的方法,會比較麻煩,用decode就會相對簡單
select sum(decode(to_char(dt, 'mm'), '01', 1,0)) as "1月"
, sum(decode(to_char(dt, 'mm'),'02', 1,0)) as "2月"
, sum(decode(to_char(dt, 'mm'),'03', 1,0)) as "3月"
, sum(decode(to_char(dt, 'mm'),'04', 1,0)) as "4月"
, sum(decode(to_char(dt, 'mm'),'05', 1,0)) as "5月"
, sum(decode(to_char(dt, 'mm'),'06', 1,0)) as "6月"
from ffm83;
執行結果如下:
1 0 2 0 0 0
備註:表ff83的結構:
create table ffm83
( *** varchar2(2),
id integer,
subject varchar2(32),
dt date
);表中的資料為:
女 1
計算機 2013/1/4
男 2
數學 2013/3/13
女 3
數學 2013/3/18
decod函式的用法
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...
Oracle常用函式
一 row number over 資料甲 1 select column name column name,data type,2 row number over partition by column name order by column name row num 3 from test c...
Oracle常用函式
數學函式 1.絕對值 o select abs 1 value from dual 2.取整 大 o select ceil 1.001 value from dual 3.取整 小 o select floor 1.001 value from dual 4.取整 擷取 o select trun...