oracle中decode函数与abs、sign、trunc、substr函数的混合使用

decode()函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。(但其不是标准SQL函数,不过这也正是他的优点,其他数据库中提供不了如此强大的函数。)

功能:

1、 流程控制,相当于IF-THEN-ELSE功能。

 用法如下:decode( expression , search , result [, search , result]... [, default] )

expression 要比较的表达式,search 要与expression 比较的字段。.

result 如果expression 与search 一样的话,返回该结果。.

default 此参数可选,如果没有与expression 匹配上的search . 就返回此结果,如果此参数没有设置,当没有与expression匹配上的search时,返回null。

search 和 result可成对出现多次,代表各种要匹配的情况。

适用于9i以上版本,如:Oracle 9i, Oracle 10g, Oracle 11g

例子:Select supplier_name,decode(supplier_id,1000,'IBM',10001,'Microsoft','1002','Hewlett Packard','Gateway') result from suppliers;

其相当于:

IF supplier_id = 10000 THEN

     result := 'IBM';

ELSIF supplier_id = 10001 THEN

    result := 'Microsoft';

ELSIF supplier_id = 10002 THEN

    result := 'Hewlett Packard';

ELSE

    result := 'Gateway';

END IF;

再一个例子,和order by一块使用,放在后面。

select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3)

2、 比较大小,此时经常同sign、trunc两个函数配合使用。

a、配合sign使用

select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1

如果date1 > date2, decode 函数返回date2. 否则decode函数返回 date1.

decode((date1 - date2) - abs(date1 - date2), 0, date2, date1)

abs函数求绝对值,上式中如果date1-date2大于0,得正值,假设结果为2,则abs(date1-date2)也为正,取2 。两者之差得0,返回0,取返回日期小的值,date2,反之。取data1

如果配合sign函数,表达式就简单的多了:

DECODE(SIGN(date1-date2), 1, date2, date1)

又如:

SIGN/DECODE 联合对于有关销售红利等数字方面的比较是非常有用的。

DECODE(SIGN(actual-target), -1, 'NO Bonus for you', 0,'Just made it', 1, 'Congrats, you are a winner')

假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%

select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee

b、配合trunc求范围

虽然不可以用decode函数来确定数字的范围. 可是我们可以试着创建一个表达式,这个表达式可以得一个数字指定的范围, 下一个数字对应下一个指定的范围, 以此类推.

我想写一个decode函数,要求如下:

如果 yrs_of_service < 1 返回 0.04

如果 yrs_of_service >= 1 and < 5 返回0.04

如果 yrs_of_service > 5 返回 0.06

则其表达式可如下写:

select emp_name,decode(trunc((yrs_of_service+3)/4),0,0.04,1,0.04,0.06) as perc_value from employees;

注:decode函数的最大参数个数为255个,包括expression, search, and result。超过这个范围将报"ORA-00939: too many arguments for function".错误

3、 表、视图结构的转化

现有一个商品销售表sale,表结构为:

month char(6) --月份

sell number(10,2) --月销售金额

现有数据为:

200001 1000

200002 1100

200003 1200

200004 1300

200005 1400

200006 1500

200007 1600

200101 1100

200202 1200

200301 1300

想要转化为以下结构的数据:

year char(4) --年份

month1 number(10,2) --1月销售金额

month2 number(10,2) --2月销售金额

month3 number(10,2) --3月销售金额

month4 number(10,2) --4月销售金额

month5 number(10,2) --5月销售金额

month6 number(10,2) --6月销售金额

month7 number(10,2) --7月销售金额

month8 number(10,2) --8月销售金额

month9 number(10,2) --9月销售金额

month10 number(10,2) --10月销售金额

month11 number(10,2) --11月销售金额

month12 number(10,2) --12月销售金额

结构转化的SQL语句为:

create or replace view

v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)

as

select

substrb(month,1,4),

sum(decode(substrb(month,5,2),'01',sell,0)),

sum(decode(substrb(month,5,2),'02',sell,0)),

sum(decode(substrb(month,5,2),'03',sell,0)),

sum(decode(substrb(month,5,2),'04',sell,0)),

上面的例子中又用到一个函数substrb。取值的部分数据的函数。

下面我们将上面用到的除decode外的函数归纳下:

abs 数学函数,求绝对值,这个就没什么好说的了。

Sign是一个符号函数,sign(x) ,其中x可以是一个值,也可以是一个返回值的表达式。

sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1

trunc截取函数,主要用于日期或数值的截取,这里有两个例子,便于理解:

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(sysdate,'yyyy') --返回当年第一天.   trunc(sysdate,'mm') --返回当月第一天.   trunc(sysdate,'d') --返回当前星期的第一天.   trunc(sysdate,'dd')--返回当前年月日

 

 TRUNC(number[,decimals])   其中:   number 待做截取处理的数值   decimals 指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分   下面是该函数的使用情况:   TRUNC(89.985,2)=89.98   TRUNC(89.985)=89   TRUNC(89.985,-1)=80

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

substr  substr() 函数返回字符串的一部分。   语法:substr(string,start,length)   必需。规定在字符串的何处开始。   正数 - 在字符串的指定位置开始   负数 - 在从字符串结尾的指定位置开始   0 - 在字符串中的第一个字符处开始

时间: 2024-08-29 05:05:56

oracle中decode函数与abs、sign、trunc、substr函数的混合使用的相关文章

oracle中decode函数的用法

oracle函数库中提供了很多有用的函数,比如nvl,sign,round等,其中用得比较多的,功能比较大的还是decode这个函数.这个函数的用法如下: decode(表达式,条件1,结果1,条件2,结果2,...)中间有几个条件与结果根据个人而定,如 decode(sign(100-20),1,20,-1,100)意思是说当(100-20)大于零时,结果为20,而当(100-20)小于零时,结果为100,其中的sign只是一个判断符号的函数 假如要对一个企业的员工进行工资调整,对于3000块

Oracle中Decode()函数使用技巧

decode|oracle|函数|技巧 decode()函數使用技巧·软件环境: 1.Windows NT4.0+ORACLE 8.0.42.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 RETU

oracle中decode函数的使用方法_oracle

含义解释: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 IFdecode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3当

oracle中decode函数

  DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值.函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式.当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值 DECODE(T1.STATUS, '96', '救援完成', '97', '拖车完成', '98', '终止/自解', '') 施救结果

oracle中rownum和row_number()_oracle

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后是先排序再计算行号码. 一.oracle中rownum 用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字

oracle中110个常用函数介绍_oracle

1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual; A A ZERO SPACE --------- --------- --------- --------- 65 97 48 32 2. CHR 给出整数,返回对应的字符; SQL> select chr(54740) zhao,chr(65) chr65 from dual; ZH C --

Oracle中TO_DATE函数使用方法详解

一.在使用Oracle的to_date函数来做日期转换时,很多Java程序员也许会直接的采用"yyyy-MM-dd HH:mm:ss"的格式作为格式进行转换,但是在Oracle中会引起错误:"ORA 01810 格式代码出现两次".如: select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;  原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQ

SQL中 decode()函数简介_MsSql

DECODE函数,是ORACLE公司的SQL软件ORACLE PL/SQL所提供的特有函数计算方式,以其简洁的运算方式,可控的数据模型和灵活的格式转换而闻名. 今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: 主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明): 使用方法: Select decode(columnname,值1,翻译值1,值2,翻译值2,...值

SQL中 decode()函数简介

DECODE函数,是ORACLE公司的SQL软件ORACLE PL/SQL所提供的特有函数计算方式,以其简洁的运算方式,可控的数据模型和灵活的格式转换而闻名. 今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: 主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明): 使用方法: Select decode(columnname,值1,翻译值1,值2,翻译值2,...值