oracle中 decode()函數

decode()函數簡介:

主要作用:將查詢結果翻譯成其他值(即以其他形式表現出來,以下舉例說明);

使用方法:

Select decode(columnname,值1,翻譯值1,值2,翻譯值2,…值n,翻譯值n,缺省值)

From talbename

Where …

其中columnname爲要選擇的table中所定義的column,

·含義解釋:

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

注:其中缺省值可以是你要選擇的column name 本身,也可以是你想定義的其他值,比如Other等;

例子:


-- 創建一個計劃表
drop table  if EXISTS plan;
create table plan (
    id int PRIMARY key,
    name varchar(255)
);


-- 創建一個計劃明細表,是計劃表的子表
drop table  if EXISTS planDetail;
create table planDetail(
    id int PRIMARY key,
    name varchar(255),
    state int,
    planId int

);


-- 插入數據
insert into plan values(1,'計劃一');
insert into plan values(2,'計劃二');
insert into plan values(3,'計劃三');

insert into planDetail values(1,'明細一',0,1);
insert into planDetail values(2,'明細2',1,1);
insert into planDetail values(3,'明細3',1,1);

insert into planDetail values(4,'明細一',0,2);
insert into planDetail values(5,'明細2',0,2);
insert into planDetail values(6,'明細3',1,2);

insert into planDetail values(7,'明細一',1,3);
insert into planDetail values(8,'明細2',1,3);
insert into planDetail values(9,'明細3',1,3);

現在要寫出一條sql語句,獲取每條計劃的id,name和該計劃的明細state爲0的明細數量、state爲1的明細數量以及state爲0或者1的數量。

如果不使用decode()函數,用left join來寫的話:


select  t.*,a.sum1,b.sum2,c.sum3  from (

select t1.id,t1.name from plan t1
LEFT JOIN planDetail t2 on t2.planid = t1.id 
GROUP BY t1.id,t1.name) t

LEFT JOIN (
-- state = 0的數量
select  t1.id,t1.name, count(t2.id) sum1 from plan t1
LEFT JOIN planDetail t2 on t2.planid = t1.id
where t2.state = 0
GROUP BY t1.id,t1.name ) a on t.id = a.id

LEFT JOIN (
-- state = 1的數量
select  t1.id,t1.name, count(t2.id) sum2 from plan t1
LEFT JOIN planDetail t2 on t2.planid = t1.id
where t2.state = 1
GROUP BY t1.id,t1.name ) b on t.id = b.id

LEFT JOIN (
-- state = 1或 state = 0的數量
select  t1.id,t1.name, count(t2.id) sum3 from plan t1
LEFT JOIN planDetail t2 on t2.planid = t1.id
where t2.state = 1 or t2.state = 0
GROUP BY t1.id,t1.name) c on t.id = c.id

需要分別寫一個sql語句來計算state不同狀態的明細數量然後全部連接起來。sql語句比較長。

而使用decode()時就比較簡單

select  t1.id,t1.name, sum(decode(state,0,1,0)) sum1,sum(decode(state,1,1,0)) sum2,sum(decode(state,0,1,1,1,0)) sum3 from plan t1
LEFT JOIN planDetail t2 on t2.planid = t1.id
where t2.state = 1 or t2.state = 0
GROUP BY t1.id,t1.name

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章