Oralce 内置了非常多的函数,这里记录一下自己遇到的。不求系统,仅为己用。
lower(string), upper(string)
大小写转换。
select lower('Hello, world!') from dual
得到 hello, world!
select upper('Hello, world!') from dual
得到 HELLO, WORLD!
length(string)
求字串长度。小本上的数据库字符集是 UTF8,对中文字符,一个字符的长度是1, 不知道别的语言集安装,是否会导致中文字符作两个字符(TODO)
select length('你好!') from dual; -- 结果为3
substr(string, m, n)
string 的 m 到 n 位字符串(从1开始)。例如
select substr('Hello, world!', 2, 5) from dual;
结果为 ello,
对于中文,可能会依赖于不同的配置环境。小本上设置的字符集是 UTF8,一个汉字作为一个字符,在虚拟机上的字符集是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,对中文的支持也没问题,一个汉字算一个字符。
附:查找 Oracle 使用的编码语句:select userenv('language') from dual;(来源:http://bbs.csdn.net/topics/260020463)
replace(string, string_search, string_replace)
替换字串。
select replace('Hello, world!', 'o', '哦');
结果为 Hell哦, w哦rld!
instr(char1, char2[,m[,n]])
找子字串的位置。
select instr('hello', 'e') from dual;
结果为2,即字母 e 在 hello 字串的第二个位置。更详细的说明如下:
语法:instr(sourceString,destString,start,appearPosition).
sourceString,源字符串;
destString,目标字串,想从源字符串中查找的子串;该参数也是可选的,默认为1;
start,查找的开始位置,该参数可选的,默认为1; 如果start的值为负数,那么代表从右往左进行查找。
appearPosition,想从源字符中查找出第几次出现的
返回值:查找到的字符串的位置。
参:http://ppzh.iteye.com/blog/215974
trim, ltrim, rtrim
消除字符串两端的空格,trim 两端的空格都消除,ltrim 只消除左端的,rtrim 只消除右端的。
例:
select length(' hello ') from dual; -- 8
select length(trim(' hello ')) from dual; -- 5
select length(ltrim(' hello ')) from dual; -- 6
select length(rtrim(' hello ')) from dual; -- 7
to_char
字符转化函数,可以格式化一些数据。
格式化日期和在工资前加上货币符号的例子:
select to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss') "入职时间",
to_char(sal, 'L00000.00') "薪水" --L表示显示本地的货币符号
from emp4;
结果为
TO_CHAR(HIREDATE,'YYYY-MM-DDHH TO_CHAR(SAL,'L0000.00')
------------------------------ -----------------------
1981-02-26 00:02:00 RMB1520.00
1981-04-01 13:04:15 RMB1700.00
1981-05-01 00:05:00 RMB2850.00
1981-06-09 00:06:00 RMB2950.00
1987-04-19 00:04:00 RMB3333.00
2010-05-01 00:05:00 RMB7000.00
2010-05-01 00:05:00 RMB4567.00
2010-05-01 00:05:00 RMB4233.56
'L9999.99'
'L0000.00' 空位用0补全
另,对 to_char 下面的日期函数部分中也有介绍。
decode
decode 函数非常有用,相当于程序语言中的 if/else 结构。
语法:DECODE(value, if1, then1, if2, then2, if3, then3, . . ., else)
nvl, nvl2
Oracle 中有个怪癖,任何量和 null 运算的结果都是 null,nvl 函数应运而生,它对不同条件下的 null 按需求转化,简单说它的功能可以表述为:“如果该值为 null,那么给这个值赋一个确定值(The function NVL returns the value of its second argument if its first argument is null.)”。在字符串连接时常有这样的用法:如果字符串为 null,那么设置为 '' (空串)。
select ename, nvl(comm, 8888) from emp; -- 如果奖金 comm 为空,则设置为 8888
How to use NVL and NVL2 function:
Oracle 内置了不少常用的数学函数。
三角函数
cos, cosh, exp, ln, log, sin, sinh, sqrt, tan, tanh, acos, asin, atan,
round
round(n[, m]) 四舍五入,m是小数位,如果m是负数,表示四舍五入到小数点前m位。
trunc(n[, m])截取,m的规则同 round 函数
mod(m, n)
求余函数,如下两例:
select mod(3, 5) from dual; -- result: 3
select mod(5, 3) from dual; -- result: 2
取整
floor(x),向上取整
ceil(x),向下取整
abs
求绝对值
count, avg, sum 等
日期的默认格式:dd-mon-yy
sysdate
当前日期,如:
select sysdate from dual;
输出:2013-5-26 23:26:23
add_months(d, n)
在 d 时间之后的 n月,如:
select add_months(sysdate, 1) from dual;
输出:2013-6-26 23:29:46
注意:并没有类似的 add_days 这种函数
例2,查询入职8月以上的员工
select ename from emp4 where add_months(hiredate, 8) < sysdate;
例3,显示满10年的员工信息
select * from emp where add_months(hiredate, 120)<=sysdate;
例4,显示每个员工在公司的天数
select ename, ceil(sysdate-hiredate) "入职天数" from emp4;
例5,找出各月倒数第三天受雇佣的员工
select * from emp4 where hiredate + 2 = last_day(hiredate);
to_char, to_date
例1,显示1981年所有入职的员工
select * from emp4 where to_char(emp4.hiredate, 'yyyy')='1981'
例2,显示12月份入职的员工
select * from emp4 where to_char(emp4.hiredate, 'mm')='05'
Oracle 默认的日期格式是 DD-MON-YY,可用如下改变日期的默认格式:
例3,
select to_char(hiredate, 'yyyy-mm-dd hh24-mi-ss') from emp4;
例4,
update emp4
set hiredate = to_date('1981-04-01 13:14:15', 'yyyy-mm-dd hh24:mi:ss')
where empno = 7566;
另,对 to_char 上面的字符函数部分中也有介绍。
sys_context,查询系统信息,它可以查如下内容
例1,查系统语言
select sys_context('userenv', 'language') from dual;
输出:SIMPLIFIED CHINESE_CHINA.AL32UTF8
例2,查数据库名称
select sys_context('userenv', 'db_name') from dual;
输出:orcl