2010年8月23日  15:45:06

                                           常用的系统函数
1字符函数

length函数

select length('abcd') from dual;

select length('abcd好') from dual;--5个字符
select lengthb('abcd好') from dual;--6个字节 一个汉字两个字节

trim函数 (去除空格函数)

select ltrim(' abcd') from dual;--截左边的空格
select rtrim(' abcd ') from dual;--截右边的空格
select trim(' abcd ') from dual;--截所有的空格
--如果字段类型是定长的,长度始终是规定的长度,所以查询的时候应该采用trim函数去掉空格

更全的用法见oracle中trim,ltrim,rtrim函数用法


substr函数 (截取字符函数)

select substr('abcdefg',2,3) from dual; --表示从第二个字符取,取三个字符
select substr('abcdefg',length('abcdefg')-3+1,3) from dual;--表示右取三个字符


REPLACE函数(字符串替代函数)
REPLACE('string','s1','s2')
--string   希望被替换的字符或变量
--s1       被替换的字符串
--s2       要替换的字符串
select replace('我的fid是22333','我','他') from dual; 结果为:他的fid是22333

 

translate函数(字符级替代函数)

字符替代函数

SELECT translate('acdd','cd','ef') FROM dual; --aeff  直接将字母c换为e,字母d换为f

如果是replace函数 SELECT REPLACE('acdd','cd','ef') FROM dual; --aefd  直接将cd换为ef

 

LOWER函数

返回字符串,并将所有的字符小写

 

UPPER函数

返回字符串,并将所有的字符大写

 

initcap函数

select initcap('ownership')  from G3E_ATTRIBUTE  --所选取的字段第一个字母用大写字母表示  

                                                                                                                                                               CONTACT函数 相当于||

select 'g3e_fid'||'设施特征唯一编号' a from G3E_ATTRIBUTE_BAK;  

select concat('g3e_fid','设施特征唯一编号') a from G3E_ATTRIBUTE_BAK;

 

instr函数   

INSTR(C1,C2,I,J)   在一个字符串中搜索指定的字符,返回发现指定的字符的位置;  

C1    被搜索的字符串  

C2    希望搜索的字符串  

I     搜索的开始位置,默认为1  

J     出现的位置,默认为1 

select instr('General Number','er',1,2) instring from G3E_ATTRIBUTE_BAK;    

J为2则选择的是Number中的er;结果为13   

J为1则选择的是General中的er;结果为4

 

RPAD和LPAD函数

RPAD(char1,n,char2)  在字符串char1的右边填充字符char2,直至字符串的总长度为n,char2的默认值为空格。如果char1长度大于n,则该函数返回char1左端的n个字符。

LPAD (char1,n,char2)在字符串char1的左边填充字符char2,直至字符串的总长度为n,char2的默认值为空格。如果char1长度大于n,则该函数返回char1左端的n个字符。                                                                                                                                select lpad(rpad('G3E_FID',12,'是111'),14,'我的')from DUAL;

--结果为:我G3E_FID是111--12和14表示粘贴字符后的字符数,如果超过规定的字符数就不粘贴了

 

CHR函数

ASCII 码值转换为字符

 select chr(45) from dual;结果为:-

 

ASCII函数

 ASCII(char):该函数用于返回字符串首字符的ASCII码值。 

 

2日期

sysdate --系统时间

select sysdate from dual;

 

current_date --当前时间

select current_date from dual;

 

next_day 返回指定日期的下一个指定日期

select next_day(sysdate,'星期一') from dual; 

返回:2010-8-30 17:35:01 (现在为2010-8-24 )8-30正好为下一个星期一

alter session set nls_date_format='dd-mon-yyy hh:mi:ss'

select next_day(sysdate,'星期六')from dual;--当前时间的下一个星期六

 

 

add_months

add_months(d,n)  查看特定时间的d之前n月或D之后N月的时间

select add_months(sysdate,-14) from dual; 结果为2009-6-24 16:53:57(当前系统时间2010-8-24 16:53:57)

 

current_timestamp 返回当前会话时区的日期时间

select current_timestamp from dual;结果为:24-8月 -10 04.57.06.593000 下午 +08:00

 

dbtimezone 返回数据库所在时区

select dbtimezone from dual;  结果为: +08:00

 

extract 用于从日期时间中提取所需的数据

 select extract(year from sysdate) from dual; 结果为2010

 

 FROM_TZ 用于将特定时区的timestamp值转为timestamp with time zone

select FROM_TZ(TIMESTAMP '2004-8-24 17:03:56','1:00') from dual;

结果为:24-8月 -04 05.03.56.000000000 下午 +01:00

 

last_day 返回特定日期所在月份的最后一天。

select last_day(sysdate) from dual; 

 

localtimestamp返回当前会话时区的日期时间

select localtimestamp from dual; 结果:24-8月 -10 05.17.20.750000 下午

 

months_between(d1,d2) 返回日期d1和d2之间相差的月数,若d1小于d2,返回负数,若d1和d2的天数相同或都是月底,返回整数

select months_between(sysdate,'8-8月-2008') from dual; 返回:24.5395725059737

 

new_time(date1,zone1,zone2):返回时区一的日期时间所对应的时区二的日期时间

select new_time(to_date('2010-8-24 17:28:35','yyyy-mm-dd hh24:mi:ss'), 'bst','est') from dual; 

返回:2010-8-24 23:28:35

 

 numtodsinterval(n,char_expr) 数字转换为时间,可转换为时、分、秒、天

char_expr可以是day,hour,minute,second

select numtodsinterval(1000,'minute') from dual; 1000转为分结果:+000000000 16:40:00.000000000

 

numtoyminterval(n,char_expr):将数字n转换为interval year to month格式,其中char_expr可以是year或month

select numtoyminterval(100000,'month') from dual;返回+000008333-04

 

sessiontimezone:返回当前会话所在时区

select sessiontimezone from dual;  返回+08:00

 

sys_extract_utc(datetime_with_timezone):返回特定时区时间所对应的格林威治时间

select sys_extract_utc(systimestamp) from dual;  返回24-8月 -10 11.54.09.015000 上午

 

systimestamp 返回当前系统的日期时间和时区

select systimestamp from dual;返回24-8月 -10 07.55.46.828000 下午 +08:00

 

ROUND和TRUNC函数

ROUND(n,[m]):该函数用于执行四舍五入运算;如果省略m,则四舍五入至整数位;如果m是负数,则四舍五入到小数点前m位;如果m是整数,则四舍五入至小数点后m位。

TRUNC(n,[m]) 该函数用于截取数字。如果省略数字m,则将数字n的小数部分截去;如果数字m是整数,则将数字n截取至小数点后的第m位;如果数字m是负数,则将数字n截取至小数点的前m位。

 

to_dsinterval(char[,'nls_param']) 将符合特定日期和时间格式的字符串转变为interval day to second 类型

select TO_DSINTERVAL('100 10:00:00') from dual; 返回:+000000100 10:00:00.000000000

 

to_timestamp 将符合特定日期和时间格式的字符串转变为timestamp类型

select to_timestamp('03-8月-10') from dual;返回:03-8月 -10 12.00.00.000000000 上午

 

to_timestamp_tz 将符合特定日期和时间格式的字符串转变为timestamp with time zone类型

select to_timestamp_tz('2003-08-10','yyyy-mm-dd') from dual;返回:10-8月 -03 12.00.00.000000000 上午 +08:00

 

to_yminterval(char): 将字符串转变为interval year to month类型

 select sysdate+to_yminterval('01-01') from dual;

返回当前时间的一年零一个以后的时间:2011-9-24 20:13:20

 

tz_offset 用于返回特定时区与UTC(格林威治时间)相比的时区偏移

select tz_offset('EST') from dual; 返回:-04:00 

 

3转换

to_char,to_date,to_number,cast

 select sysdate from dual;

select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

select to_date('12-3月-04') from dual;select to_number('3333') from dual;

 cast(expr as type_name):该函数用于将一个内置数据类型或集合类型转变为另一个内置数据类型或集合类型。

 

select gwm_ano, cast( gwm_ano as varchar2(50) ) cat from gwm_attribute;

 

 

4聚集函数

sum,avg,max,min,count

COUNT()函数 

SELECT COUNT(au_lname) FROM authors

 

AVG()函数   

SELECT AVG(vote) FROM opinion 

函数AVG()只能对数值型字段使用

 

SUM()函数   

SELECT SUM(purchase_amount) FROM orders

MAX()函数    SELECT MAX(vote) FROM opinion

MIN()函数    SELECT MIN(vote) FROM opinion

 

5、数字函数

ABS函数

ABS(n),该函数用于返回数字n的绝对值。示例如下,
declare
  v_abs number(6,2);
begin
  v_abs:=abs(&no);
  dbms_output.put_line('绝对值:'||v_abs);
end;
输入no的值:-12.6,
绝对值:12.6   

ASIN函数

ASIN(n):该函数用于返回数字n的反正弦值,输入范围范围-1-1,输出值的单位为弧度。示例如下:
declare
  v_asin number(6,3);
begin
  v_asin:=asin(.3);
  dbms_output.put_line('0.3的反正弦值:'||v_asin);
end;
0.3的反正弦值:.305                                                                                                                         

ACOS函数

 ACOS(n):该函数用于返回数字n的反余弦值,输入值的范围-1-1,输出值的单位为弧度。示例如下:
select acos(.3),acos(-.3) from dual;  

TAN函数

TAN(n)该函数用于返回数字n(以弧度表示的角)的正切值。

TANH函数

TANH(n)该函数用于返回数字n(以弧度表示的角)的双曲正切值。

ATAN函数

ATAN(n):该函数用于返回数字n的反正切值,输入值范围可以是任何数字,输出值的单位为弧度。示例如下:
select atan(59),atan(55) from dual;  

ATAN2函数

ATAN2(n,m):该函数用于返回数字n除以数字m的反正切值。输入值除了m不能为0外,可以是任意数字(m不能为0),输出值的单位为弧度。示例如下:

declare
  v_atan2 number(6,3);
begin
  v_atan2:=atan2(19,3);
  dbms_output.put_line('19/3的反正切值:'||v_atan2);
end;
19/3的反正切值:1.414 

CEIL函数

返回大于或等于给出数字的最小整数      

select ceil(3.1415927) from dual;  

SIN函数

SIN(n)该函数用于返回数字n(以弧度表示的角)的正弦值。

SINH函数

SINH(n)该函数用于返回数字n的双曲余弦值。 

COS函数

 COS(n):该函数用于返回数字n(以弧度表示的角度值)的余弦值。
declare
  v_cos number(6,3);
begin
  v_cos:=cos(0.5);
  dbms_output.put_line('0.5的余弦值:'||v_cos);
end;
0.5的余弦值:.878

COSH函数

 COSH(n):该函数用于返回数字n的双曲余弦值。示例如下:
select cosh(0) "0的双曲余弦值" from dual;

 EXP函数

 

EXP(n):该函数用于返回e的n次幂(e=2.71828183。。。)。示例如下:
declare
  v_exp number(6,2);
begin
  v_exp:=exp(4);
  dbms_output.put_line('e的4次方:'||v_exp);
end;

e的4次方:54.

SQRT函数

 

SQRT(n)该函数用于返回数字n的平方根,并且数字n必须大于等于0。 

FLOOR函数

该函数用于返回小于等于数字n的最大整数

select floor(2345.67) from dual;   2345 

LN函数

LN(n):该函数用于返回数字n的自然对数,其中数字n必须大于0。示例如下:
declare
  v_ln number(6,2);
begin
  v_ln:=ln(4);
  dbms_output.put_line('4的自然对数:'||v_ln);
end;
4的自然对数:1.39  

LOG函数

LOG(m,n):该函数用于返回数字m为底的数字n的对数,数字n可以是除0和1以外的任何正整数,数字n可以是任何正整数。示例如下:

select log(2,8),log(10,100) from dual; 

MON函数

MON(m,n):该函数用于取得两个数字相除后的余数。如果数字n为0,则返回结果为m。
declare
  v_mod number(6,2);
begin
  v_mod:=mod(10,3);
  dbms_output.put_line('10除3的余数:'||v_mod);
end;
10除3的数:1  

POWER函数

 POWER(m,n):该函数用于返回数字m的n次幂,底数m和指数n可以是任意数字。但是如果数字m为负数,则数字n必须大于整数。   

SIGN函数    取数字n的符号,大于0返回1,小于0返回-1,等于0返回0           

                                                                                

 6、10g新增函数

 Oracle 8 和Oracle 9i中缺乏灵活性的SQL 正则表达式最终在Oracle 10g中得到了解决。Oracle 数据库目前内建了符合POSIX 标准的正则表达式

四个新的函数分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和 REGEXP_REPLACE。它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法类似,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。 

   这四个函数支持正则表达式

正则表达式字符说明:

 特殊字符含义:
'^' 表示字符串的开始
'$' 表示字符串的结束
'.' 表示任何字符
字符的范围,比如说'[a-z]',表示任何ASCII 小写字母,与字符类"[[:lower:]]"" 等价
'?' 允许一个后继字符匹配零次或一次
'+' 允许一个后继字符匹配一次或多次
'*' 表示零次或多次
'( )' 标记一个子表达式的开始和结束位置。
'[]' 标记一个中括号表达式。
'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
'|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。

[^...]:匹配字符集以外的任意字符。例如:[^a-f] 匹配 af 以外的任意字符。
[...]:匹配一个字符集中的任意字符。在字符集中使用短划线分隔第一个字符和最后一个字符。例如:
       [123] 匹配数字 123
       [a-f] 匹配从 af 的任意字母

 

字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

各种操作符的运算优先级
转义符/
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序
| “或”操作

 

具体的可见 http://www.google.com/support/a/bin/answer.py?hl=zh-CN&answer=1371415

 

测试数据:

create table test5(mc varchar2(60));
insert into test5 values('112233445566778899');
insert into test5 values('22113344 5566778899');
insert into test5 values('33112244 5566778899');
insert into test5 values('44112233 5566 778899');
insert into test5 values('5511 2233 4466778899');
insert into test5 values('661122334455778899');
insert into test5 values('771122334455668899');
insert into test5 values('881122334455667799');
insert into test5 values('991122334455667788');
insert into test5 values('aabbccddee');
insert into test5 values('bbaaaccddee');
insert into test5 values('ccabbddee');
insert into test5 values('ddaabbccee');
insert into test5 values('eeaabbccdd');
insert into test5 values('ab123');
insert into test5 values('123xy');
insert into test5 values('007ab');
insert into test5 values('abcxy');
insert into test5 values('The final test5 is is is how to find duplicate words.');
commit;
 

REGEXP_LIKE函数
select * from test5 where regexp_like(mc,'^a{1,3}');
select * from test5 where regexp_like(mc,'a{1,3}');
select * from test5 where regexp_like(mc,'^a.*e$');
select * from test5 where regexp_like(mc,'^[[:lower:]]|[[:digit:]]');
select * from test5 where regexp_like(mc,'^[[:lower:]]');
Select mc FROM test5 Where REGEXP_LIKE(mc,'[^[:digit:]]');

Select mc FROM test5 Where REGEXP_LIKE(mc,'^[^[:digit:]]');

 

REGEXP_INSTR函数
Select REGEXP_INSTR(mc,'[[:digit:]]$') from test5;  112233445566778899
Select REGEXP_INSTR(mc,'[[:digit:]]+$') from test5;
Select REGEXP_INSTR('The price is $400.','\$[[:digit:]]+') FROM DUAL;
Select REGEXP_INSTR('onetwothree','[^[[:lower:]]]') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]*') FROM DUAL;

Select REGEXP_INSTR(',,,,,','[^,]') FROM DUAL;

 

REGEXP_SUBSTR函数
SELECT REGEXP_SUBSTR(mc,'[a-z]+') FROM test5;
SELECT REGEXP_SUBSTR(mc,'[0-9]+') FROM test5;

SELECT REGEXP_SUBSTR('aababcde','^a.*b') FROM DUAL;

 

REGEXP_REPLACE函数
Select REGEXP_REPLACE('Joe Smith','( ){2,}', ',') AS RX_REPLACE FROM dual;
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual;

 

7其他

select user from dual;--查询当前用户                                                                                                                  

decode函数

select decode(sign(变量1-变量2),-1,变量1,变量2) from dual;

select sum(decode('sex','男',1,0)) 男人数,sum(decode('sex','女',1,0)) 女人数 from e;

sign()函数

根据某个值是0、正数还是负数,分别返回0、1、-1;

nvl函数

NVL函数的格式如下:NVL(expr1,expr2)

含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值select a1,nvl(a2,'未输入'),a3 from aa;--处理空值

NVL2函数

NVL2函数的格式如下:NVL2(expr1,expr2, expr3)

含义是:如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值。

NULLIF函数

NULLIF(expr1,expr2)函数的作用是如果exp1和exp2相等则返回空(NULL),否则返回第一个值。

Coalesce函数

Coalese函数的作用是的NVL的函数有点相似,其优势是有更多的选项。

格式如下:Coalesce(expr1, expr2, expr3….. exprn)Coalesce是这样来处理这些参数的。如果第一个参数为空,则看第二个参数是否是空,否则则显示第一个参数,如果第二个参数是空再看第三个参数是否为空,否则显示第二个参数,依次类推。这个函数实际上是NVL的循环使用  

 

sys_guid ()函数

在Oracle 8i以后提供sys_guid ()方法

 

 
方法作用:
系统根据当前时间和机器码,生成全球唯一的一个序列号。
 
方法使用场景:
      这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用,因为这样可以防止主键冲突。
       因为采用sequence的话,只能保证在同一个数据中该序列号唯一,但是在不同的数据库实例中有可能冲突。
该方法的弊端:
     由于sys_guid ()生成的序列号过长,这会消耗数据库存储空间,且管理不方便。
基于此,在非并行环境下的数据库应用中,应尽量避免使用sys_guid ()
方法举例:
   select sys_guid() from dual;
-------------------------------------------
    6E3DC539CF7944E7BC4650D0EEF06865

 

 

 

 

 

posted on 2010-08-23 16:29  蓝紫  阅读(9941)  评论(0编辑  收藏  举报