您的位置:首页 > 数据库 > Oracle

Oracle 函数

2016-03-21 09:58 417 查看
/*字符函数*/
/*变成大写*/
select Upper('abcde') from dual;
/*变成小写*/
select lower('ADCSE') from dual;
/*第一个字母变成大写*/
select Initcap('dkdkdkdkd') from dual;
/*合并字符*/
select concat('a', 'b')
from dual;
select 'a' || 'b'
from dual;
/*截取字符串*/
select substr('abcde', length('abcde') - 2) from dual;

/*从开始的位置截取要的个数字符串,-代表从后向前计算,+代表从前向后计算*/
select substr('abcde', -5, 3) from dual;
/*计算字符串长度 不区分半角全角*/
select Length(t.membername)
from MEMBERINFO t
/*替换*/
select replace('abcae', 'a', 'm') from dual;

/*查询匹配字符串所在的位置 相当于 index of*/
select Instr('Hello World', 'or') from dual;
/*左侧填充*/
select Lpad('Smith', 10, '*')
from dual
/*右侧填充*/
select Rpad('Smith', 10, '*')
from dual
/*去除左右空格*/
select trim('  dfd  ') from dual;

/*数值函数*/
/*四舍五入*/
select round(415, -1) from dual;
select round(414.21, 1) from dual;

/*取余*/
select Mod(12, 11)
from dual;
/*
TRUNC(number,num_digits)
Number 需要截尾取整的数字。
Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。
TRUNC()函数截取时不进行四舍五入
*/
select trunc(123.458) from dual; --123
select trunc(123.458, 0) from dual; --123
select trunc(123.458, 1) from dual; --123.4
select trunc(123.458, -1) from dual; --120
select trunc(123.458, -4) from dual; --0
select trunc(123.458, 4) from dual; --123.458
select trunc(123) from dual; --123
select trunc(123, 1) from dual; --123
select trunc(123, -1) from dual; --120

/*日期函数*/
/*计算月份差*/
select months_between(sysdate, t.createdate)
from MEMBERINFO t;
/*增加月份*/
select add_months(sysdate, 1)
from dual;
/*得到下一个星期一的日期*/
select next_day(sysdate, '星期一')
from dual;
/*本月最后一天*/
select last_day(sysdate) from dual;

/*转换函数*/
--获得当前年
select to_char(sysdate, 'yyyy') from dual;
--获得当前年月日
select to_char(sysdate, 'fmyyyy-mm-dd') from dual;
--格式化价格样式
select to_char('11112222', 'L999,999,999') from dual; --¥11,112,222
--返回在星期, 星期日为1,星期一为2,星期二为3.........星期六为7
select to_char(sysdate, 'D') from dual;

--转化成数字
select to_number('13') + to_number('14') from dual;

--转化成日期
select to_date('20090210', 'yyyyMMdd') from dual;

/*通用函数*/
-- 如为空 返回默认值
select nvl(null, 0)
from dual;
-- 如果表达式 exp1 与 exp2 的值相等则返回null,否则返回exp1的值
select nullif('aaa', 'aaa') from dual;

--如果参数表达式expr1值为NULL,则NVL2()函数返回参数表达式expr3的值;如果参数表达式expr1值不为NULL,则NVL2()函数返回参数表达式expr2的值。
select nvl2(null, '11' + '22', '22') total from dual;
--返回表达式中第一个非空表达式
select coalesce(null, 11, 0) from dual;

--case 表达式
select case t.memberstate
when '10' then
'初建档未生效'
when '20' then
'待激活状态'
when '30' then
'已激活状态'
when '50' then
'停用'
when '60' then
'退费'
when '70' then
'删除'
else
'未知状态'
end 状态
from MEMBERINFO t;

--DECODE 函数 与case 表达式类似 decode() 函数也用于实现多路分支结构
select decode(memberstate,
'10',
'初建档未生效',
'20',
'待激活状态',
'30',
'已激活状态',
'50',
'停用',
'60',
'退费',
'70',
'删除',
'未知状态') 部门
from MEMBERINFO;

/*分组函数*/
--count 计算总数 没有数据显示0
select count(*) from dual;
--平均值
select avg(memberstate) from MEMBERINFO;
--max 最大值
select max(memberstate) from MEMBERINFO;
--min 最小值
select min(memberstate) from MEMBERINFO;
--sum 求和
select sum(memberstate) from MEMBERINFO;

--Group by 子句 可以与分组函数一起使用
select avg(memberid), memberstate from memberinfo t group by memberstate;

--having 子句
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000;

--获取日期,月份,年份

SELECT TO_CHAR(TO_DATE('2016-08-01','YYYY-MM-DD')+ROWNUM-1,'YYYY-MM-DD') DATE1 FROM USER_OBJECTS
WHERE ROWNUM <=(TO_DATE('2016-09-01','YYYY-MM-DD')-TO_DATE('2016-08-01','YYYY-MM-DD')) ;

SELECT MONTHS_BETWEEN(TO_DATE('2016-12-12','YYYY-MM-DD'),TO_DATE('2015-12-12','YYYY=MM-DD')) MON FROM DUAL;

SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2016-01-01','YYYY-MM-DD'),(ROWNUM-1)),'YYYY-MM') DATE1 FROM USER_OBJECTS
WHERE ROWNUM<= MONTHS_BETWEEN(TO_DATE('2016-09-01','YYYY-MM-DD'),TO_DATE('2016-01-01','YYYY-MM-DD'))+1;

SELECT DATE1,DATE2,DATE3
FROM (SELECT DISTINCT TO_CHAR(TO_DATE('2015-01-01','yyyy-mm-dd')+(rownum-1),'yyyy-q') DATE1,
TO_CHAR(add_months(TO_DATE('2015-01-01','yyyy-mm-dd')+(rownum-1),-3),'yyyy-q') DATE2,
TO_CHAR(add_months(to_date('2015-01-01','yyyy-mm-dd')+(rownum-1),-12),'yyyy-q') DATE3
      		FROM  DBA_OBJECTS
     	    WHERE ROWNUM <= (TO_DATE('2016-09-10','yyyy-mm-dd') - TO_DATE('2015-01-01','yyyy-mm-dd') )
      	) WHERE DATE1!=DATE2;
        
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2010'||'-01', 'yyyy-MM'), (ROWNUM - 1) * 12),'yyyy') DATE1 FROM DUAL
CONNECT BY ROWNUM <= months_between(TO_DATE('2016', 'yyyy'),TO_DATE('2010', 'yyyy')) / 12 + 1;

--regexp_substr函数

select regexp_substr('35,36,37', '[^,]+', 1, level) from dual
connect by regexp_substr('35,36,37', '[^,]+', 1, level) is not null;

--listagg函数

select mattercode,listagg(mattercode,',') within group (order by mattercode) as matterlist from table_name

需要注意:

1.必须的分组,也就是说 group by 是必须的

2.listagg函数的第一个参数是需要枚举的字段,也就是mattecode,

  第二个参数是枚举类型值之间的分隔符同时还需要排序和分组witnin group (order by mattercode)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 函数