[Oracle] decode 函数及其用法

本文介绍DECODE函数的基本语法和应用场景,通过具体实例展示如何利用该函数实现行转列操作,提高数据处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

DECODE()函数,它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。

语法结构如下:

decode (expression, search_1, result_1)
decode (expression, search_1, result_1, search_2, result_2)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)

decode (expression, search_1, result_1, default)
decode (expression, search_1, result_1, search_2, result_2, default)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)
比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。


实例使用

1. 创建一个学生成绩表。栏位有: 学生名, 科目名和分数

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. create table student_score(  
  2.    name varchar2(30),  
  3.    subject varchar2(20),  
  4.    score number(4,1)  
  5. );  

2. 插入测试数据

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. insert into student_score (name,subject,score)values('zhang san','Chinese',90);  
  2. insert into student_score (name,subject,score)values('zhang san','Mathematics',80);  
  3. insert into student_score (name,subject,score)values('zhang san','English',79);  

3.

测试一:

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select name,subject,decode(subject, 'Chinese',score,0) from student_score;  
结果如下:

如果是中文课程的话, 显示分数, 其他课程分数为零。

这条SQL 看上去使用意义不大。

测试二: 

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select name,sum(decode(subject, 'Chinese',score,0)) as CHINESE from student_score group by name;  

统计中文课程的分数。看上去有点意义。

总体看来, decode 的使用看上去和case when 有点类似。如果只是用作以上两种状况,看上去意义不大。

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select name,sum(decode(subject, 'Chinese',score,0)) as CHINESE from student_score group by name;  
  2. select name,score as CHINESE from student_score;  
使用的两句使用后的效果一样,看上去使用decode 多此一举。

行转列-有意义的使用

往以上table 再插入一些其他学生的成绩:

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. insert into student_score (name,subject,score)values('li shi','Chinese',96);  
  2. insert into student_score (name,subject,score)values('li shi','Mathematics',86);  
  3. insert into student_score (name,subject,score)values('li shi','English',76);  
  4.   
  5. insert into student_score (name,subject,score)values('wang wu','Chinese',92);  
  6. insert into student_score (name,subject,score)values('wang wu','Mathematics',82);  
  7. insert into student_score (name,subject,score)values('wang wu','English',72);  

使用以下SQL:

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select name,  
  2. sum(decode(subject, 'Chinese', nvl(score, 0), 0)) "Chinese",  
  3. sum(decode(subject, 'Mathematics', nvl(score, 0), 0)) "Mathematics",  
  4. sum(decode(subject, 'English', nvl(score, 0), 0)) "English"  
  5. from student_score  
  6. group by name;  

返回:

将行的数据转化为列, 是不是很有意义了。


使用case then 也可以达到相同的效果。

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select name,  
  2. sum(case when subject='Chinese'  
  3.               then nvl(score,0)  
  4.          else 0  
  5.     end"Chinese",  
  6. sum(case when subject='Mathematics'  
  7.               then nvl(score,0)  
  8.          else 0  
  9.     end"Mathematics",  
  10. sum(case when subject='English'  
  11.               then nvl(score,0)  
  12.          else 0  
  13.     end"English"  
  14. from student_score  
  15. group by name;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值