【oracle资料整理】--【5】ORALCE的函数之单行函数

来源:互联网 发布:图纸算量软件 编辑:程序博客网 时间:2024/05/22 09:51

单行函数
  字符函数
    concat 连接  ||
   <1>显示dname和loc中间用-分隔
     select deptno,dname||'----'||loc from dept;
    
     dual哑元表   没有表需要查询的时候 可以用它
         select 'Hello World' from dual;
         select 1+1 from dual;
         查询系统时间
          select sysdate from dual;
   <2>  initcap 首字母大写
       select ename,initcap(ename) from emp;
   <3>  lower   转换为小写字符
        select ename,lower(ename) from emp;
   <4> upper 转换为大写
        update dept set loc=lower(loc);
        update dept set loc=upper(loc);
   <5> LPAD 左填充
        select deptno,lpad(dname,10,' '),loc from dept;
   <6> RPAD 右填充
   <7> LTRIM 去除左边的空格
       RTRIM 去除右边的空格
       ALLTRIM  去除两边的空格
   <8>replace    替换
      translate  转换
       select ename,replace(ename,'S','s') from emp;
           用's'去替换ename中的'S'
        select ename,translate(ename,'S','a') from emp;
   <9> ASCII 求ASC码
       chr   asc码变字符
         select ascii('A') from dual;
         select chr(97) from dual;
         select 'Hello'||chr(9)||'World' from dual;
                           '/t' ascii码是 9
                           '/n' ascii码是 10

         select 'Hello'||'/t'||'World' from dual;    

   <10> substr 字符截取函数
           select ename,substr(ename,1,3) from emp;
               从第1个位置开始 显示3个字符
           select ename,substr(ename,4) from emp;
              从第4个位置开始显示后面所有的字符
   <11> instr 测试字符串出现的位置
          select ename,instr(ename,'S') from emp;
             'S'第1次出现的位置
  select ename,instr(ename,'T',1,2) from emp;                
             从第1个位置开始 测试'T'第2次出现的位置 
  <12> length 字符串的长度
        select ename,length(ename) from emp;
      
日期和 时间函数
   <1> sysdate 系统时间
        select sysdate from dual;
        select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
        select to_char(sysdate,'DDD') from dual  
      select to_char(sysdate,'D') from dual
      select to_char(sysdate,'DAY') from dual

      select to_char(sysdate,'yyyy-mm-dd') from dual;

  select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss') from dual;
 
 select '''' from dual;

select to_char(sysdate,'SSSSS') from dual;
  --从今天零点以后的秒数

   <2> ADD_MONTHS 添加月份 得到一个新的日期
        select add_months(sysdate,1) from dual;

       select add_months(sysdate,-1) from dual;

       select trunc(sysdate)-to_date('20050101','yyyymmdd') from dual;
       select add_months(sysdate,12) from dual;
           一年以后的今天
select add_months(sysdate,-12) from dual;
           一年以前的今天

     trunc(sysdate) 截取年月日
 
 select sysdate+2 from dual;
        数字代表的是天数

     两个日期之间的差值代表天数

   <3> last_day  某月的最后一天
       select last_day(sysdate) from dual;
      
       select add_months(last_day(sysdate)+3,-1) from dual;
            本月第3天的日期
  <4>  months_between 两个日期之间的月数
         select months_between(sysdate,'2005-02-01') from dual;
                 方向 sysdate - '2005-02-01'
      select months_between('2005-02-01',sysdate) from dual;
    
 转换函数
   to_char   把日期或数字类型变为字符串
       select to_char(sysdate,'hh24:mi:ss') from dual;
       select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;

       select sal,to_char(sal,'L9,999') from emp;
             L本地货币
  to_number   把字符串变成数字
      select to_number('19990801') from dual;
 
  to_date     把字符串变成日期
      select to_date('19800101','yyyymmdd') from dual;

      select to_char(to_date('19800101','yyyymmdd'),
        'yyyy"年"mm"月"dd"日"') from dual;     
 数学函数
    ceil(x)  不小于x的最小整数
        ceil(12.4)   13
        ceil(-12.4)   -12
    floor(x)  不大于x的最大整数
        floor(12.5)  12
        floor(-12.4)  -13


   round(x)  四舍五入
     round(12.5)   13
     round(12.456,2) 12.46

   trunc(x)  舍去尾数
     trunc(12.5)  12
     trunc(12.456,2)  12.45
    舍去日期的小时部分
     select to_char(trunc(sysdate),'yyyymmdd hh24:mi:ss') from dual;
   mod(x,n)  x除以n以后的余数
     mod(5,2) 1
     mod(4,2) 0

   power(x,y)  x的y次方
    select power(3,3) from dual;
    
 
混合函数
      求最大值
   select greatest(100,90,80,101,01,19) from dual;
  
      求最小值
   select least(100,0,-9,10) from dual;

      空值转换函数 nvl(comm,0) 字段为空值 那么就返回0 否则返回本身
   select comm,nvl(comm,0) from emp;
      comm 类型和 值的类型是 一致的
  
复杂的函数
   decode   选择结构  (if ... elseif .... elesif ... else结构)
   
要求:
   sal=800  显示低工资  
   sal=3000  正常工资
   sal=5000  高工资
    只能做等值比较

  select sal,decode(sal,800,'低工资',3000,'正常工资',5000,'高工资','没判断')
  from emp;
 表示如下的if  else 结构
     if sal=800 then
        '低工资'
     else if sal =3000 then
        '正常工资'
     else if  sal = 5000 then
         '高工资'
     else
        '没判断'
     end if
         

   sal > 800           sal -800 > 0  

 判断正负
  sign(x)   x是正  1
            x是负  -1
            x是0   0
    select sign(-5) from  dual;


 如何做大于小于的比较????
  sal<1000  显示低工资   sal-1000<0   sign(sal-1000) = -1
   1000<=sal<=3000  正常工资
   3000<sal<=5000  高工资

   select sal,decode(
             sign(sal-1000),-1,'低工资',
            decode(sign(sal-3000),-1,'正常工资',
                            0,'正常工资',1,
            decode(sign(sal-5000),-1,'高工资','高工资')
             )) as 工资状态 from emp;
     
  一般的情况  decode(x,y1,z1,y2,z2,z3)
      if x= y1 then
          z1         
      else if x = y2 then
          z2
      else
         z3
      end if