[b]1、DECODE函数是ORACLE PL/SQL是功能强大的函数之一。[/b]
[b]2、函数涵义:[/b]
网上摘录如下:[color=blue]DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value 等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。[/color]
[b]3、例子:[/b]
3.1 可以看成是case when的简写版,如下:
数据结构
CREATE TABLE USERS (ID INTEGER NOT NULL, NAME VARCHAR2(20), SEX CHAR(1), HEIGHT NUMBER(16,2), PRIMARY KEY (ID));
(sex:1-男,2-女,height:身高)
* > select * from users;
------------------------------
id name sex height
1 jack 1 1.78
2 lily 2 1.6
3 amma 2 1.58
4 kimi 1 1.7
将sex转义为中文:
* > select id,name,decode(sex,'1','男','2','女','未知') as sex,height from users;
------------------------------
id name sex height
1 jack 男 1.78
2 lily 女 1.6
3 amma 女 1.58
4 kimi 男 1.7
3.2 行转列
数据结构同3.1
需求:现要统计,用户(users)表的男女生的数量,传统的写法如下:
* > select decode(sex,'1','男生合计数','2','女生合计数','未知') as sex,count(*) as numb from users group by sex;
------------------------------
sex numb
男生合计数 2
女生合计数 2
[u][b]***** 这样有个缺点,就是变成了两行数据,但如果我想变成一行数据呢?即把男女生的合计数,并成一行,那么,就要灵活运用DECODE()函数,和sum()函数,如下:[/b][/u]
* > select sum(decode(sex,'1','1')) as 男生合计数,sum(decode(sex,'2','1')) as 女生合计数 from users;
------------------------------
男生合计数 女生合计数
2 2
3.3 行转列,DECODE()函数配合AVG()函数。
[b]**** 需求:统计男女生的平均身高。[/b]
* > select avg(decode(sex,'1',height)) as 男生平均身高,avg(decode(sex,'2',height)) as 女生平均身高 from users;
------------------------------
男生平均身高 女生平均身高
1.74 1.59
[b]2、函数涵义:[/b]
网上摘录如下:[color=blue]DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value 等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。[/color]
[b]3、例子:[/b]
3.1 可以看成是case when的简写版,如下:
数据结构
CREATE TABLE USERS (ID INTEGER NOT NULL, NAME VARCHAR2(20), SEX CHAR(1), HEIGHT NUMBER(16,2), PRIMARY KEY (ID));
(sex:1-男,2-女,height:身高)
* > select * from users;
------------------------------
id name sex height
1 jack 1 1.78
2 lily 2 1.6
3 amma 2 1.58
4 kimi 1 1.7
将sex转义为中文:
* > select id,name,decode(sex,'1','男','2','女','未知') as sex,height from users;
------------------------------
id name sex height
1 jack 男 1.78
2 lily 女 1.6
3 amma 女 1.58
4 kimi 男 1.7
3.2 行转列
数据结构同3.1
需求:现要统计,用户(users)表的男女生的数量,传统的写法如下:
* > select decode(sex,'1','男生合计数','2','女生合计数','未知') as sex,count(*) as numb from users group by sex;
------------------------------
sex numb
男生合计数 2
女生合计数 2
[u][b]***** 这样有个缺点,就是变成了两行数据,但如果我想变成一行数据呢?即把男女生的合计数,并成一行,那么,就要灵活运用DECODE()函数,和sum()函数,如下:[/b][/u]
* > select sum(decode(sex,'1','1')) as 男生合计数,sum(decode(sex,'2','1')) as 女生合计数 from users;
------------------------------
男生合计数 女生合计数
2 2
3.3 行转列,DECODE()函数配合AVG()函数。
[b]**** 需求:统计男女生的平均身高。[/b]
* > select avg(decode(sex,'1',height)) as 男生平均身高,avg(decode(sex,'2',height)) as 女生平均身高 from users;
------------------------------
男生平均身高 女生平均身高
1.74 1.59