oracle常用函式 decode

2021-12-30 12:05:55 字數 2620 閱讀 3189

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...