oracle中decode函数的使用方法_oracle_脚本之家

by admin on 2019年11月26日

oracle trunc()函数是最常用的函数之一,下面就为您介绍oracle
trunc()函数的用法,供您参考,希望可以让您对oracle
trunc()函数有更深的认识。

1.round函数

1.TRUNC

在oracle中,有rank,dense_rank,row_number,以及分组排名partition。

含义解释:decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

1.TRUNC

描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果

TRUNC函数为指定元素而截去的日期值。

rank:排名会出现并列第n名,它之后的会跳过空出的名次,例如:1,2,2,4dense_rank:排名会出现并列第n名,它之后的名次为n+1,例如:1,2,2,3row_number:排名采用唯一序号连续值,例如1,2,3,4partition:将排名限制到某一分组

该函数的含义如下:复制代码 代码如下:IF
条件=值1 THEN RETURNELSIF 条件=值2 THEN RETURN ……ELSIF 条件=值n THEN
RETURNEND IFdecode

TRUNC函数为指定元素而截去的日期值。

number : 欲处理之数值

其具体的语法格式如下:

row_number() over(partition by bb.channel_name order by sum desc nulls
last) p1_rank1,row_number() over(order by sum desc nulls last)
rank1,dense_rank() over(order by nvl, 0) desc) rank2,rank() over(order
by sum desc nulls last) rank3

这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多

其具体的语法格式如下:TRUNC

decimal_places : 四舍五入 , 小数取几位

TRUNC
procedure GetCompetitionRanking(p_UserId in integer, p_CompetitionId in integer, v_cursor out CompetitionCursor)isv_startDate date;v_endDate date;tmp_startDate varchar2;tmp_endDate varchar2;tmp_date date;v_sql1 varchar2;v_sql2 varchar2;v_where varchar2;v_comTotal integer;v_groupTotal integer;v_comRanking integer;v_groupRanking integer;beginselect t.start_date, t.end_date into v_startDate, v_endDate from tbl_competition t where t.competition_id = p_CompetitionId;tmp_date:= v_endDate+1;tmp_startDate := to_char(v_startDate, 'yyyy-mm-dd');tmp_endDate := to_char(tmp_date, 'yyyy-mm-dd');--group personal totalselect count into v_groupTotal from tbl_com_group_user awhere a.com_group_id in(select b.com_group_id from tbl_com_group_user b where b.user_id = p_UserId);-- Competition personal totalselect count into v_comTotal from(select a.com_group_id from tbl_com_group a where a.competition_id = p_CompetitionId) a inner join tbl_com_group_user b on a.com_group_id = b.com_group_id;--user in competition ranking and group rankingv_where := 't.DATA_TYPE_ID=1 AND t.STATUS=1 ANDt.DATA_DATE_1 >= TO_DATE||tmp_startDate||chr||'yyyy-mm-dd'||chr ANDt.DATA_DATE_1 < TO_DATE||tmp_endDate||chr||'yyyy-mm-dd'||chr ';/*select no from(select a.USER_ID, dense_rank() over(order by sum) desc) no from(select user_id from tbl_com_group aleft join tbl_com_group_user b on a.com_group_id = b.com_group_idwhere a.competition_id = 1) a left join VM_MASTER_DATA t on a.user_id = t.user_id and t.DATA_TYPE_ID=1 AND t.STATUS=1 ANDt.DATA_DATE_1 >= TO_DATE('2012-10-02','yyyy-mm-dd') ANDt.DATA_DATE_1 < TO_DATE('2012-12-01','yyyy-mm-dd') group by a.user_idorder by no desc) where user_id = 165*/v_sql1 := 'select no from(select a.USER_ID, dense_rank() over(order by sum) desc) no from(select user_id from tbl_com_group aleft join tbl_com_group_user b on a.com_group_id = b.com_group_idwhere a.competition_id = '||p_CompetitionId||') a left join VM_MASTER_DATA t on a.user_id = t.user_id and '|| v_where||'group by a.user_idorder by no desc ) where user_id = '||p_UserId;dbms_output.put_line;execute immediate v_sql1 into v_comRanking;dbms_output.put_line('------------------------------');--dbms_output.put_line;/*select no from( select a.USER_ID, dense_rank() over(order by sum) desc) no from(select a.user_id from tbl_com_group_user awhere a.com_group_id in(select b.com_group_id from tbl_com_group_user b where b.user_id = 165)) a left join VM_MASTER_DATA t on a.user_id = t.user_id and t.DATA_TYPE_ID=1 AND t.STATUS=1 ANDt.DATA_DATE_1 >= TO_DATE('2012-10-02','yyyy-mm-dd') ANDt.DATA_DATE_1 < TO_DATE('2012-12-01','yyyy-mm-dd') group by a.user_idorder by no desc)where user_id=165*/v_sql2 := 'select no from(select a.USER_ID, dense_rank() over(order by sum) desc) nofrom(select a.user_id from tbl_com_group_user awhere a.com_group_id in(select b.com_group_id from tbl_com_group_user b where b.user_id = '||p_UserId||')) a left join VM_MASTER_DATA t on a.user_id = t.user_id and '|| v_where||'group by a.user_idorder by no desc ) where user_id = '||p_UserId;dbms_output.put_line;execute immediate v_sql2 into v_groupRanking;--dbms_output.put_line('------------------------------');--dbms_output.put_line;if v_comRanking is null thenv_comRanking := v_comTotal;end if;if v_groupRanking is null thenv_groupRanking := v_groupTotal;end if;open v_cursor forselect v_comTotal CompetitionPersonalTotal, v_groupTotal UserInGroupPersonTotal, v_comRanking UserInCompRanking, v_groupRanking UserInGroupRanking from dual;exceptionwhen others thennull;end;

使用方法:1、比较大小select decode,-1,变量1,变量2) from dual;
–取较小值sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1例如:变量1=10,变量2=20则sign返回-1,decode解码结果为“变量1”,达到了取较小值的目的。

其中:date一个日期值fmt
日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去

select round from dual; 返回123select round from dual; 返回123.5select round from dual; 返回-123.46

fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去

2、此函数用在SQL语句中,功能介绍如下:

下面是该函数的使用情况:

2.ceil和floor函数

下面是该函数的使用情况:

Decode函数与一系列嵌套的
IF-THEN-ELSE语句相似。base_exp与compare1,compare2等等依次进行比较。如果base_exp和
第i 个compare项匹配,就返回第i 个对应的value
。如果base_exp与任何的compare值都不匹配,则返回default。每个compare值顺次求值,如果发现一个匹配,则剩下的compare值就都不再求值。一个为NULL的base_exp被认为和NULL
compare值等价。如果需要的话,每一个compare值都被转换成和第一个compare
值相同的数据类型,这个数据类型也是返回值的类型。

TRUNC(TO_DATE(’24-Nov-1999 08:00 pm’,’dd-mon-yyyy hh:mi am’))
=’24-Nov-1999 12:00:00 am’TRUNC(TO_DATE(’24-Nov-1999 08:37
pm’,’dd-mon-yyyy hh:mi am’,’hh’))=’24-Nov-1999 08:00:00 am’

ceil和floor函数在一些业务数据的时候,有时还是很有用的。

TRUNC(TO_DATE(‘24-Nov-1999 08:00 pm‘),‘dd-mon-yyyy hh:mi am‘)=‘24-Nov-1999 12:00:00 am‘TRUNC(TO_DATE(‘24-Nov-1999 08:37 pm‘,‘dd-mon-yyyy hh:mi am‘),‘hh‘) =‘24-Nov-1999 08:00:00 am‘trunc --返回当年第一天。trunc --返回当月第一天。trunc --返回当前星期的第一天。trunc--返回当前年月日

Decode函数在实际开发中非常的有用

round
未指定format时,如果日期中的时间在中午之前,则将日期中的时间截断为12
A.M.,否则进到第二天。

ceil 取大于等于数值n的最小整数;

2.TRUNC

结合Lpad函数,如何使主键的值自动加1并在前面补0select
LPAD,0,1,max,14,’0′) 记录编号 from tetdmis复制代码 代码如下:select decode from
a1_interval

TRUNC未指定format时,将日期截为12 A.M.,不考虑是否在中午之前的条件。

floor取小于等于数值n的最大整数

TRUNC函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。

dir 的值是1变为0,是0则变为1

2.TRUNC

select ceil a from dual; 返回2select ceil a from dual; 返回-1select floor a from dual; 返回1select floor a from dual; 返回-2
TRUNC

比如我要查询某班男生和女生的数量分别是多少?

TRUNC函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。

3.trunc函数

number 待做截取处理的数值

通常我们这么写:复制代码 代码如下:select
count from 表 where 性别 = 男;

其具体的语法格式如下TRUNC

1)trunc函数处理数字

decimals 指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分

select count from 表 where 性别 = 女;

其中:number待做截取处理的数值decimals指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分

number 待做截取处理的数值

下面是该函数的使用情况:

要想显示到一起还要union一下,太麻烦了

下面是该函数的使用情况:TRUNC=89.98TRUNC=89TRUNC=80

decimals
指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分。

TRUNC=89.98TRUNC=89TRUNC=80

用decode呢,只需要一句话复制代码
代码如下:select decode,decode from 表3,order by对字符列进行特定的排序

注意:第二个参数可以为负数,表示为小数点左边指定位数后面的部分截去,即均以0记。

trunc就是处理数字的显示位数,如果decimals为负数,就处理整数部分,处理完为0,-1就是各位为零,-2就到了十位,如果超过了
整数部分长度,则整个数字0;

注意:第二个参数可以为负数,表示为小数点左边指定位数后面的部分截去,即均以0记。与取整类似,比如参数为1即取整到十分位,如果是-1,则是取整到十位,以此类推。

大家还可以在Order by中使用Decode。

以上oracle trunc()函数的用法介绍。

trunc函数返回以指定元元素格式截去一部分的日期值。

以上所述是小编给大家介绍的Oracle自我补充之trunc()函数的使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。复制代码 代码如下:select * from table_subject
order by decode(subject_name, ‘语文’, 1, ‘数学’, 2, , ‘外语’,3)

Oracle trunc()函数的实例:

其具体的语法格式如下:

 --Oracle trunc()函数的用法/**************日期********************/1.select trunc from dual --2011-3-18 今天的日期为2011-3-182.select trunc from dual --2011-3-1 返回当月第一天.3.select trunc from dual --2011-1-1 返回当年第一天4.select trunc from dual --2011-3-18 返回当前年月日5.select trunc from dual --2011-1-1 返回当年第一天6.select trunc from dual --2011-3-13 返回当前星期的第一天7.select trunc from dual --2011-3-18 14:00:00 当前时间为14:41 8.select trunc from dual --2011-3-18 14:41:00 TRUNC()函数没有秒的精确/***************数字********************//*TRUNC Number 需要截尾取整的数字。 Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。TRUNC()函数截取时不进行四舍五入*/9.select trunc from dual --12310.select trunc from dual --12311.select trunc from dual --123.412.select trunc from dual --12013.select trunc from dual --014.select trunc from dual --123.45815.select trunc from dual --12316.select trunc from dual --12317.select trunc from dual --120

date为必要参数,是输入的一个日期值

fmt参数可忽略,是日期格式,用以指定的元素格式来截去输入的日期值。忽略它则由最近的日期截去
下面是该函数的使用情况:

trunc --返回当年第一天.trunc --返回当月第一天.trunc --返回当前星期的第一天.selecttruncfrom dual;selecttruncfrom dual;selecttruncfrom dual;

以上所述是小编给大家介绍的oracle中函数
trunc,floor的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图