ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

oracle-常用函数

2021-04-09 12:57:15  阅读:211  来源: 互联网

标签:返回 SYSDATE 常用 函数 DUAL oracle n2 c1 SELECT


(一).数值型函数(Number Functions) 


    数值型函数输入数字型参数并返回数值型的值。多数该类函数的返回值支持38位小数点,诸如:COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小数点。ACOS, ASIN, ATAN, and ATAN2支持30位小数点。 

1、 MOD(n1,n2) 返回n1除n2的余数,如果n2=0则返回n1的值。 
    例如:SELECT MOD(24,5) FROM DUAL; 

2、 ROUND(n1[,n2]) 返回四舍五入小数点右边n2位后n1的值,n2缺省值为0,如果n2为负数就舍入到小数点左边相应的位上(虽然oracle documents上提到n2的值必须为整数,事实上执行时此处的判断并不严谨,即使n2为非整数,它也会自动将n2取整后做处理,但是我文档中其它提到必须为整的地方需要特别注意,如果不为整执行时会报错的)。 
例如:SELECT ROUND(23.56),ROUND(23.56,1),ROUND(23.56,-1) FROM DUAL; 

3、 TRUNC(n1[,n2] 返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上。 
例如:SELECT TRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1) FROM DUAL;

 

 

(二)字符处理函数

 

 

函数名称

功    能

实  例

结  果

ascii

获得字符的ASCII码

Ascii('A')

65

chr

返回与ASCII码相应的字符

Chr(65)

A

lower

将字符串转换成小写

lower ('SQL Course')

sql course

upper

将字符串转换成大写

upper('SQL Course')

SQL COURSE

initcap

将字符串转换成每个单词以大写开头

initcap('SQL course')

Sql Course

concat

连接两个字符串

concat('SQL', ' Course')

SQL Course

substr

给出起始位置和长度,返回子字符串

substr('String',1,3)

Str

length

求字符串的长度

length('Wellcom')

7

instr

给出起始位置和出现的次数,求子字符串在字符串中出现的位置

instr('String', 'r',1,1)

3

lpad

用字符填充字符串左侧到指定长度

lpad('Hi',10,'-')

--------Hi

rpad

用字符填充字符串右侧到指定长度

rpad('Hi',10,'-')

Hi--------

trim

在一个字符串中去除另一个字符串

trim('S' FROM 'SSMITH')

MITH

replace

用一个字符串替换另一个字符串中的子字符串

replace('ABC', 'B', 'D')

ADC


 

 

 

(三).日期函数(Datetime Functions) 

 

本类函数中,除months_between返回数值外,其它都将返回日期。 

1、 ADD_MONTHS() 返回指定日期月份+n之后的值,n可以为任何整数。 
例如:SELECT ADD_MONTHS(sysdate,12),ADD_MONTHS(sysdate,-12) FROM DUAL; 

2、 CURRENT_DATE 返回当前session所在时区的默认时间 
例如: 
SQL> alter session set nls_date_format = 'mm-dd-yyyy' ; 
SQL> select current_date from dual; 

3、 SYSDATE 功能与上相同,返回当前session所在时区的默认时间。但是需要注意的一点是,如果同时使用sysdate与current_date获得的时间不一定相同,某些情况下current_date会比sysdate快一秒。经过与xyf_tck(兄台的大作ORACLE的工作机制写的很好,深入浅出)的短暂交流,我们认为current_date是将current_timestamp中毫秒四舍五入后的返回,虽然没有找到文档支持,但是想来应该八九不离十。同时,仅是某些情况下会有一秒的误差,一般情况下并不会对你的操作造成影响,所以了解即可。 
例如:SELECT SYSDATE,CURRENT_DATE FROM DUAL; 

4、 LAST_DAY(d) 返回指定时间所在月的最后一天 
例如:SELECT last_day(SYSDATE) FROM DUAL; 

5、 NEXT_DAY(d,n) 返回指定日期后第一个n的日期,n为一周中的某一天。但是,需要注意的是n如果为字符的话,它的星期形式需要与当前session默认时区中的星期形式相同。 
例如:三思用的中文nt,nls_language值为SIMPLIFIED CHINESE 
SELECT NEXT_DAY(SYSDATE,5) FROM DUAL; 
SELECT NEXT_DAY(SYSDATE,'星期四') FROM DUAL; 
两种方式都可以取到正确的返回,但是: 
SELECT NEXT_DAY(SYSDATE,'Thursday') FROM DUAL; 
则会执行出错,提供你说周中的日无效,就是这个原因了。 

6、 MONTHS_BETWEEN(d1,d2) 返回d1与d2间的月份差,视d1,d2的值大小,结果可正可负,当然也有可能为0 
例如: 
SELECT months_between(SYSDATE, sysdate), 
months_between(SYSDATE, add_months(sysdate, -1)), 
months_between(SYSDATE, add_months(sysdate, 1)) 
FROM DUAL; 

7、 ROUND(d[,fmt]) 前面讲数值型函数的时候介绍过ROUND,此处与上功能基本相似,不过此处操作的是日期。如果不指定fmt参数,则默认返回距离指定日期最近的日期。 
例如:SELECT ROUND(SYSDATE,'HH24') FROM DUAL; 

8、 TRUNC(d[,fmt]) 与前面介绍的数值型TRUNC原理相同,不过此处也是操作的日期型。 
例如:SELECT TRUNC(SYSDATE,'HH24') FROM DUAL; 

 

 

(四).其它辅助函数

1、 DECODE(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成一个增强型的if else,只不过它并不通过多行语句,而是在一个函数内实现if else的功能。 
exp做为初始参数。s做为对比值,相同则返回r,如果s有多个,则持续遍历所有s,直到某个条件为真为止,否则返回默认值def(如果指定了的话),如果没有默认值,并且前面的对比也都没有为真,则返回空。 
毫无疑问,decode是个非常重要的函数,在实现行转列等功能时都会用到,需要牢记和熟练使用。 

例如:select decode('a2','a1','true1','a2','true2','default') from dual; 

 

示例如下: 

  select decode( x , 1 , ‘x is 1 ’, 2 , ‘x is 2 ’, ‘others’) from dual 

  当x等于1时,则返回‘x is 1’。 

  当x等于2时,则返回‘x is 2’。 

  否则,返回others’。 

  在需要比较2个值的时候,我们可以配合SIGN()函数一起使用。 

  SELECT DECODE( SIGN(5 -6), 1 'Is Positive', -1, 'Is Nagative', 'Is Zero') 

  同样,也可以用CASE实现: 

  SELECT CASE SIGN(5 - 6) 

  WHEN 1 THEN 'Is Positive' 

  WHEN -1 THEN 'Is Nagative' 

  ELSE 'Is Zero' END 

  FROM DUAL 

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

  例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。 

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

 

 

2、 GREATEST(n1,n2,...n) 返回序列中的最大值 
例如:SELECT GREATEST(15,5,75,8) "Greatest" FROM DUAL; 

3、 LEAST(n1,n2....n) 返回序列中的最小值 
例如:SELECT LEAST(15,5,75,8) LEAST FROM DUAL; 

4、 NULLIF(c1,c2) 
Nullif也是个很有意思的函数。逻辑等价于:CASE WHEN c1 = c2 THEN NULL ELSE c1 END 
例如:SELECT NULLIF('a','b'),NULLIF('a','a') FROM DUAL; 

5、 NVL(c1,c2) 逻辑等价于IF c1 is null THEN c2 ELSE c1 END。c1,c2可以是任何类型。如果两者类型不同,则oracle会自动将c2转换为c1的类型。 
例如:SELECT NVL(null, '12') FROM DUAL; 

6、 NVL2(c1,c2,c3) 大家可能都用到nvl,但你用过nvl2吗?如果c1非空则返回c2,如果c1为空则返回c3 
例如:select nvl2('a', 'b', 'c') isNull,nvl2(null, 'b', 'c') isNotNull from dual; 

7、 SYS_CONNECT_BY_PATH(col,c) 该函数只能应用于树状查询。返回通过c1连接的从根到节点的路径。该函数必须与connect by 子句共同使用。 
例如: 
create table tmp3( 
rootcol varchar2(10), 
nodecol varchar2(10) 
); 

insert into tmp3 values ('','a001'); 
insert into tmp3 values ('','b001'); 
insert into tmp3 values ('a001','a002'); 
insert into tmp3 values ('a002','a004'); 
insert into tmp3 values ('a001','a003'); 
insert into tmp3 values ('a003','a005'); 
insert into tmp3 values ('a005','a008'); 
insert into tmp3 values ('b001','b003'); 
insert into tmp3 values ('b003','b005'); 

select lpad(' ', level*10,'=') ||'>'|| sys_connect_by_path(nodecol,'/') 
from tmp3 
start with rootcol = 'a001' 
connect by prior nodecol =rootcol; 

8、 SYS_CONTEXT(c1,c2[,n]) 将指定命名空间c1的指定参数c2的值按照指定长度n截取后返回。
Oracle9i提供内置了一个命名空间USERENV,描述了当前session的各项信息,其拥有下列参数: 
 CURRENT_SCHEMA:当前模式名; 
 CURRENT_USER:当前用户; 
 IP_ADDRESS:当前客户端IP地址; 
 OS_USER:当前客户端 操作系统用户; 
等等数十项,更详细的参数列还请大家直接参考Oracle Online Documents 

例如:SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') FROM DUAL; 
注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。 

单值函数在查询中返回单个值,可被应用到select,where子句,start with以及connect by 子句和having子句。 

 

标签:返回,SYSDATE,常用,函数,DUAL,oracle,n2,c1,SELECT
来源: https://blog.51cto.com/u_15161566/2694105

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有