[Oracle] decode 函数及其用法

来源:互联网 发布:最好小额网络投资理财 编辑:程序博客网 时间:2024/05/17 01:58

前言

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;  

原文地址:http://blog.csdn.net/oscar999/article/details/18399177
0 0
原创粉丝点击