- 浏览: 121301 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
liguocai2009:
liguocai2009 写道经过我我的测试,600万的数据, ...
Oracle row_number() over()解析函数高效实现分页 -
liguocai2009:
经过我我的测试,600万的数据,row_number()耗时4 ...
Oracle row_number() over()解析函数高效实现分页 -
学会做人:
lbs1988 写道扯淡 谁说row_number() ove ...
Oracle row_number() over()解析函数高效实现分页 -
lbs1988:
扯淡 谁说row_number() over 效率高 他们效率 ...
Oracle row_number() over()解析函数高效实现分页 -
id0096:
没觉得效率高到哪里去...用180W条数据测试,很多情况下没有 ...
Oracle row_number() over()解析函数高效实现分页
在工作中经常遇到要用decoder函数
我这里举两个典型的例子
将表:
______________________________________
|a_name | a_subject | a_score |
|张三 | 语文 | 80 |
|张三 | 数学 | 70 |
|张三 | 英语 | 60 |
|李四 | 语文 | 90 |
|李四 | 数学 | 30 |
|李四 | 英语 | 100 |
--------------------------------------
转换成:
______________________________________
| \ | 语文 | 数学 | 英语 |
|张三 | 80 | 70 | 60 |
|李四 | 90 | 30 | 100 |
--------------------------------------
--创建表
drop table t_across;
create table t_across(
a_name varchar2(20) not null,
a_subject varchar2(20) not null,
a_score number(3)
);
--插入数据
insert into t_across(a_name,a_subject,a_score)
values('张三','语文',80);
insert into t_across(a_name,a_subject,a_score)
values('张三','数学',70);
insert into t_across(a_name,a_subject,a_score)
values('张三','英语',60);
insert into t_across(a_name,a_subject,a_score)
values('李四','语文',90);
insert into t_across(a_name,a_subject,a_score)
values('李四','数学',30);
--显示数据
select * from t_across;
--显示交叉表的格式
select a_name "学生\成绩",sum(decode(a_subject,'语文',a_score,null)) "语文",
sum(decode(a_subject,'数学',a_score,null)) "数学",
sum(decode(a_subject,'英语',a_score,null)) "英语"
from t_across
group by a_name;
----------
******************************************************
++++++++++++++++++++++++++++++++++++++++++++++++++++++
=======================================================
=======================================================
++++++++++++++++++++++++++++++++++++++++++++++++++++++
******************************************************
Oracle中Decode()函数使用技巧
DECODE函数是ORACLE PL/SQL是功能强大的函数之一。它有什么用途呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%,通常的做法是,先选出记录中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else或choose case之类的流控制语句进行判断。 如果用DECODE函数,那么我们就可以把这些流控制语句省略,通过SQL语句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee 是不是很简洁? DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。
decode()函数使用技巧
·软件环境:
1、Windows NT4.0+ORACLE 8.0.4
2、ORACLE安装路径为:C:\ORANT
·含义解释:
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
· 使用方法:
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
实力2:
建表:
create table T_SHOES
(
P_ID NUMBER(10),
P_SIZE NUMBER(3),
P_COLOR VARCHAR2(6),
P_NUM NUMBER(5)
);
输入测试数据如下:
select p_id, p_size, p_color, p_num from t_shoes;
P_ID P_SIZE P_COLOR P_NUM
1 38 黑 100
1 38 红 10
1 40 黑 50
2 38 黑 100
3 38 红 5
因为结果集要通过存储过程,所以创建结果统计报表:
create table t_shoes_report
(
P_SIZE NUMBER(3),
P_COLOR VARCHAR2(6),
P_NUM NUMBER(5)
);
创建视图,以提供所有颜色和尺寸的匹配情况(利用了笛卡尔乘积)
create or replace view v_all_products as
select distinct all_size.p_size,all_color.p_color
from
(select distinct t.p_size from t_shoes t ) all_size,
(select distinct t.p_color from t_shoes t) all_color
通过逐步打印,完成以下存储过程的编写:
create or replace procedure sp_report
as
str1 number(3);
str2 varchar2(30000);
begin
delete from t_shoes_report;
for all_size in (select distinct p_size from v_all_products )
loop
--dbms_output.put_line(all_size.p_size);
for all_color in ( select distinct p_color from v_all_products where p_size = all_size.p_size)
loop
--dbms_output.put_line(all_size.p_size||','||all_color.p_color);
--统计
select nvl(sum(t.p_num),0) into str1 from t_shoes t
where t.p_size = all_size.p_size
and t.p_color = all_color.p_color;
--str2 := all_size.p_size||','||all_color.p_color||','||str1;
--dbms_output.put_line(str2);
insert into t_shoes_report(p_size,p_color,p_num)
values(all_size.p_size,all_color.p_color,str1);
end loop;
end loop;
commit;
end ;
测试:
SQL> execute sp_report;
PL/SQL procedure successfully completed
SQL> select * from t_shoes_report;
P_SIZE P_COLOR P_NUM 表A
------ ------- ------
38 黑 200
38 红 15
40 黑 50
40 红 0
在得到上面的数据,可以通过以下方法进行报表显示
报表
尺寸/颜色 黑 红
38 200 15
40 50 0
1、通过java程序将表A数据转化HTML代码,显示为表B
2、通过SQL语句转化
select
t.p_size 尺寸,
sum(decode(t.p_color,'黑',t.p_num)) 黑,
sum(decode(t.p_color,'红',t.p_num)) 红
from t_shoes_report t
group by t.p_size
结果:
尺寸 黑 红
38 200 15
40 50 0
对于特殊sql来说还挺多的!下次再总结了!
我这里举两个典型的例子
将表:
______________________________________
|a_name | a_subject | a_score |
|张三 | 语文 | 80 |
|张三 | 数学 | 70 |
|张三 | 英语 | 60 |
|李四 | 语文 | 90 |
|李四 | 数学 | 30 |
|李四 | 英语 | 100 |
--------------------------------------
转换成:
______________________________________
| \ | 语文 | 数学 | 英语 |
|张三 | 80 | 70 | 60 |
|李四 | 90 | 30 | 100 |
--------------------------------------
--创建表
drop table t_across;
create table t_across(
a_name varchar2(20) not null,
a_subject varchar2(20) not null,
a_score number(3)
);
--插入数据
insert into t_across(a_name,a_subject,a_score)
values('张三','语文',80);
insert into t_across(a_name,a_subject,a_score)
values('张三','数学',70);
insert into t_across(a_name,a_subject,a_score)
values('张三','英语',60);
insert into t_across(a_name,a_subject,a_score)
values('李四','语文',90);
insert into t_across(a_name,a_subject,a_score)
values('李四','数学',30);
--显示数据
select * from t_across;
--显示交叉表的格式
select a_name "学生\成绩",sum(decode(a_subject,'语文',a_score,null)) "语文",
sum(decode(a_subject,'数学',a_score,null)) "数学",
sum(decode(a_subject,'英语',a_score,null)) "英语"
from t_across
group by a_name;
----------
******************************************************
++++++++++++++++++++++++++++++++++++++++++++++++++++++
=======================================================
=======================================================
++++++++++++++++++++++++++++++++++++++++++++++++++++++
******************************************************
Oracle中Decode()函数使用技巧
DECODE函数是ORACLE PL/SQL是功能强大的函数之一。它有什么用途呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%,通常的做法是,先选出记录中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else或choose case之类的流控制语句进行判断。 如果用DECODE函数,那么我们就可以把这些流控制语句省略,通过SQL语句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee 是不是很简洁? DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。
decode()函数使用技巧
·软件环境:
1、Windows NT4.0+ORACLE 8.0.4
2、ORACLE安装路径为:C:\ORANT
·含义解释:
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
· 使用方法:
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
实力2:
建表:
create table T_SHOES
(
P_ID NUMBER(10),
P_SIZE NUMBER(3),
P_COLOR VARCHAR2(6),
P_NUM NUMBER(5)
);
输入测试数据如下:
select p_id, p_size, p_color, p_num from t_shoes;
P_ID P_SIZE P_COLOR P_NUM
1 38 黑 100
1 38 红 10
1 40 黑 50
2 38 黑 100
3 38 红 5
因为结果集要通过存储过程,所以创建结果统计报表:
create table t_shoes_report
(
P_SIZE NUMBER(3),
P_COLOR VARCHAR2(6),
P_NUM NUMBER(5)
);
创建视图,以提供所有颜色和尺寸的匹配情况(利用了笛卡尔乘积)
create or replace view v_all_products as
select distinct all_size.p_size,all_color.p_color
from
(select distinct t.p_size from t_shoes t ) all_size,
(select distinct t.p_color from t_shoes t) all_color
通过逐步打印,完成以下存储过程的编写:
create or replace procedure sp_report
as
str1 number(3);
str2 varchar2(30000);
begin
delete from t_shoes_report;
for all_size in (select distinct p_size from v_all_products )
loop
--dbms_output.put_line(all_size.p_size);
for all_color in ( select distinct p_color from v_all_products where p_size = all_size.p_size)
loop
--dbms_output.put_line(all_size.p_size||','||all_color.p_color);
--统计
select nvl(sum(t.p_num),0) into str1 from t_shoes t
where t.p_size = all_size.p_size
and t.p_color = all_color.p_color;
--str2 := all_size.p_size||','||all_color.p_color||','||str1;
--dbms_output.put_line(str2);
insert into t_shoes_report(p_size,p_color,p_num)
values(all_size.p_size,all_color.p_color,str1);
end loop;
end loop;
commit;
end ;
测试:
SQL> execute sp_report;
PL/SQL procedure successfully completed
SQL> select * from t_shoes_report;
P_SIZE P_COLOR P_NUM 表A
------ ------- ------
38 黑 200
38 红 15
40 黑 50
40 红 0
在得到上面的数据,可以通过以下方法进行报表显示
报表
尺寸/颜色 黑 红
38 200 15
40 50 0
1、通过java程序将表A数据转化HTML代码,显示为表B
2、通过SQL语句转化
select
t.p_size 尺寸,
sum(decode(t.p_color,'黑',t.p_num)) 黑,
sum(decode(t.p_color,'红',t.p_num)) 红
from t_shoes_report t
group by t.p_size
结果:
尺寸 黑 红
38 200 15
40 50 0
对于特殊sql来说还挺多的!下次再总结了!
发表评论
-
oracle异常处理
2009-06-28 20:35 1950:变量名类似Pst 中 sql 的 ... -
性能优化之--------索引
2009-06-03 20:28 1148一, oracle的索引陷阱一个表中有几百万条数据,对某个字 ... -
oracle性能优化------分区技术
2009-06-02 07:08 1404数据库性能优化 Oracle方面的特性:分区技术 分区索 ... -
Oracle分区表总结
2009-05-25 16:02 1208在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应 ... -
Oracel函数
2009-05-24 14:31 1774SQL中的单记录函数1.ASCII返回与指定的字符对应 ... -
使用JDBC插入大量数据的性能测试
2009-05-21 16:18 3084使用jdbc向数据库插入100000条记录,分别使用state ... -
Oracle的光标
2009-05-20 21:07 1213... -
OLTP和OLAP的区别
2009-05-16 12:01 1567OLTP是联机事务处理 OLAP是联机分析处理 1.用户和 ... -
如何实现网站流量设计
2009-05-14 08:08 980需求:某网站每天都有 ... -
sql性能分析
2009-05-14 07:25 1053规则:select 字句要避免使用*。 使 ... -
Oracle最快删除重复记录
2009-05-12 07:45 1463Oracle删除重复记录的最快方法:++++++++++ ... -
实际项目中是如何进行数据库建模的
2009-05-12 07:26 1079其实在实际项目中建模的精华不外乎就是以下几点,但是真正的把 ... -
悲观锁和乐观锁
2009-05-10 23:56 1367加锁对并发访问的影响体现在锁的粒度上: 1、悲观锁假定其他 ... -
怎样杀死死锁!
2009-05-10 21:49 11281、 查出是哪个过程被锁! 2、查出是哪一个sid,通过si ... -
Oracle 的树形递归查询
2009-05-10 18:01 4284一、树型表结构: 节点ID 上级ID 节点名称 二 ... -
外键的认识和理解
2009-05-05 19:18 933外键的认识和理解:++++++++++++++++++++++ ... -
导入导出1000万条数据
2009-05-05 19:07 2607如何导入导出大数据量( ... -
Oracle sql性能优化总结
2009-05-04 23:11 805选择最有效率的表名顺 ... -
rownum总结
2009-05-04 16:58 978对于 Oracle 的 rownum 问题,很多资料都说不支持 ... -
什么是数据仓库
2009-05-04 00:55 911我们都知道,利用多种 ...
相关推荐
Oracle的DECODE函数是一种条件表达式,用于在SQL语句中执行类似于IF...THEN...ELSE逻辑判断的功能。它根据一个指定的表达式的值,与一系列的条件进行比较,如果匹配到某个条件,则返回对应的值;如果没有匹配任何...
Oracle中的DECODE函数是一种非常实用的工具,它允许你在SQL查询中执行简单的条件判断和返回相应的值。这个函数类似于IF-THEN-ELSE语句的简写形式,减少了编写复杂逻辑的代码量,使得SQL语句更加简洁易读。 DECODE...
Oracle DECODE函数功能很强,下面就为您详细介绍Oracle DECODE函数的用法,希望可以让您对Oracle DECODE函数有更多的了解。 Oracle DECODE函数 Oracle DECODE函数是Oracle公司独家提供的功能,它是一个功能很强的...
Decode 函数是一个强大的 Oracle 函数,用于根据条件返回不同的值。它的语法结构为 `decode(条件,值 1,返回值 1,值 2,返回值 2,...值 n,返回值 n,缺省值)`。decode 函数的含义是,如果条件等于值 1,则返回返回值 1...
### Oracle的DECODE函数详解 #### 一、DECODE函数简介 在Oracle数据库中,`DECODE`函数是一种非常实用的条件判断函数,其功能类似于编程语言中的`IF`语句。通过比较输入值与一系列预设值,该函数能够根据匹配情况...
### ORACLE DECODE函数在中国式报表统计查询中的组合条件实现 #### 一、引言 在Oracle数据库中,`DECODE`函数是一种非常实用的功能,主要用于条件判断并返回不同的值。它经常被用来进行简单的条件分支处理,尤其...
在Oracle数据库中,DECODE函数是一个非常实用的工具,它允许你在SQL查询中进行条件判断,将特定的值转换为其他值。DECODE函数在处理列转行的问题时,尤其适用于将多列数据合并到一行中,使得数据展示更加简洁明了。...
下面将详细介绍Oracle Decode()函数的使用技巧。 1. **基本语法**: Decode()函数的基本语法如下: ``` DECODE(source, value1, result1, value2, result2, ..., default_value) ``` 其中,`source`是要检查的...
### Oracle中Decode()函数的有关用法 #### 一、Decode()函数简介 在Oracle数据库中,`DECODE()`函数是一种非常实用的功能,主要用于条件判断并返回特定的值。它提供了一种简单的方法来实现多分支逻辑判断,尤其是...
DECODE 函数是 Oracle PL/SQL 的功能强大的函数之一,目前还只有 Oracle 公司的 SQL 提供了此函数,其他数据库厂商的 SQL 实现还没有此功能。 DECODE 函数的语法是:DECODE(value, if1, then1, if2, then2, if3, ...
DECODE函数是Oracle PL/SQL中的一个独特特性,它在软件开发,尤其是数据库查询中,提供了一种简洁而高效的方法来进行条件判断和数据转换。这个函数在Oracle SQL中扮演了if-then-else逻辑的角色,允许开发者在SQL查询...
Oracle中的`DECODE`函数是一种非常实用的工具,它允许你在SQL查询中执行简单的条件判断,类似于编程语言中的三元运算符或者IF-THEN-ELSE结构。`DECODE`函数的基本语法是: ```sql DECODE(条件, 值1, 返回值1, 值2, ...
Decode函数是Oracle数据库中用于实现条件逻辑的一个内置函数,它类似于编程语言中的switch-case语句或if-then-else语句。Decode函数可以对给定的表达式进行多个条件判断,并返回匹配条件的相应值。Decode函数广泛...
5. 条件函数:如IFNULL(如果为空则替换)、NVL(空值替换)、DECODE(根据条件返回值)等,处理可能出现的空值情况。 6. 聚合函数:如COUNT(计数)、SUM(求和)、AVG(平均值)、MAX/MIN(最大值/最小值)等,...
Oracle内置函数是数据库管理系统Oracle中不可或缺的一部分,它们用于执行各种数据处理任务,包括数学运算、字符串操作、日期处理等。这篇博文将深入探讨Oracle内置函数的学习,帮助你更好地理解和运用这些功能强大的...
本文主要探讨了Oracle中的一些常用函数,并通过实例解析了它们的基本用法,特别介绍了DECODE函数的使用技巧。 首先,我们来看数字函数。在Oracle中,ABS(x)函数用于计算数值的绝对值,例如ABS(-10)返回10。CEIL(x)...
Oracle中的DECODE函数是一个非常实用的工具,它允许我们在SQL查询中进行条件判断,并返回相应的值。DECODE函数的基本语法如下: ```sql DECODE(value, if1, then1, if2, then2, ..., else) ``` 1. **DECODE用于...