Oracle单行函数

SQL> --字符函数
SQL> select lower('Hello WORLd') 转小写,upper('Hello WORLd') 转大写,
  2         initcap('hello world') 首字母大写
  3  from dual;

转小写      转大写      首字母大写                                              
----------- ----------- -----------                                             
hello world HELLO WORLD Hello World                                             

SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符
SQL> select substr('hello world',3) from dual;

SUBSTR('H                                                                       
---------                                                                       
llo world                                                                       

SQL> --substr(a,b,c) 从a中,第b位开始取,取c位
SQL> select substr('hello world',3,4) from dual;

SUBS                                                                            
----                                                                            
llo                                                                             

SQL> host cls

SQL> --length 字符数  lengthb 字节数
SQL> select length('hello world')  字符数,lengthb('hello world')  字节数
  2  from dual;

    字符数     字节数                                                           
---------- ----------                                                           
        11         11                                                           

SQL> ed
已写入 file afiedt.buf

  1  select length('中国')  字符数,lengthb('中国')  字节数
  2* from dual
SQL> /

    字符数     字节数                                                           
---------- ----------                                                           
         2          4                                                           

SQL> host cls

SQL> --instr(a,b) 从a中查找b,找到返回下标,否则返回0
SQL> select instr('hello world','ll') from dual;

INSTR('HELLOWORLD','LL')                                                        
------------------------                                                        
                       3                                                        

SQL> host cls

SQL> --lpad 左填充 rpad右填充
SQL> select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右
  2  from dual;

左         右                                                                   
---------- ----------                                                           
******abcd abcd******                                                           

SQL> --trim: 去掉前后指定的字符
SQL> select trim('H' from  'Hello WorldH') from dual;

TRIM('H'FR                                                                      
----------                                                                      
ello World                                                                      

SQL> --replace 替换
SQL> select replace('hello world',
  2  'l','*') from dual;

REPLACE('HE                                                                     
-----------                                                                     
he**o wor*d                                                                     

SQL> host cls

SQL> --四舍五入
SQL> select ROUND(45.926, 2) 一,ROUND(45.926, 1) 二,ROUND(45.926, 0) 三,
  2         ROUND(45.926, -1) 四, ROUND(45.926, -2) 五
  3  from dual;

        一         二         三         四         五                          
---------- ---------- ---------- ---------- ----------                          
     45.93       45.9         46         50          0                          

SQL> ed
已写入 file afiedt.buf

  1  select TRUNC(45.926, 2) 一,TRUNC(45.926, 1) 二,TRUNC(45.926, 0) 三,
  2         TRUNC(45.926, -1) 四, TRUNC(45.926, -2) 五
  3* from dual
SQL> /

        一         二         三         四         五                          
---------- ---------- ---------- ---------- ----------                          
     45.92       45.9         45         40          0                          

SQL> host cls

SQL> --日期函数
SQL> select sysdate from dual;

SYSDATE                                                                         
--------------                                                                  
19-6月 -13                                                                      

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

TO_CHAR(SYSDATE,'YY                                                             
-------------------                                                             
2013-06-19 14:22:23                                                             

SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff') from dual;

TO_CHAR(SYSTIMESTAMP,'YYYY-MM                                                   
-----------------------------                                                   
2013-06-19 14:23:22:000000                                                      

SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff') from dual;

TO_CHAR(SYSTIMESTAMP,'YYYY-MM                                                   
-----------------------------                                                   
2013-06-19 14:23:24:843000                                                      

SQL> --昨天 今天 明天
SQL> select (sysdate-1) 昨天, sysdate 今天,(sysdate+1) 明天
  2  from dual;

昨天           今天           明天                                              
-------------- -------------- --------------                                    
18-6月 -13     19-6月 -13     20-6月 -13                                        

SQL> host cls

SQL> --计算员工的工龄
SQL> select ename,hiredate,(sysdate-hiredate) 天, (sysdate-hiredate)/7 星期,
  2                        (sysdate-hiredate)/30 月,(sysdate-hiredate)/3653  from emp;

ENAME      HIREDATE               天       星期         月         年           
---------- -------------- ---------- ---------- ---------- ----------           
SMITH      17-12月-80     11872.6018 1696.08597 395.753392 32.5276761           
ALLEN      20-2月 -81     11807.6018 1686.80025 393.586725 32.3495939           
WARD       22-2月 -81     11805.6018 1686.51454 393.520059 32.3441144           
JONES      02-4月 -81     11766.6018 1680.94311 392.220059 32.2372651           
MARTIN     28-9月 -81     11587.6018 1655.37168 386.253392 31.7468541           
BLAKE      01-5月 -81     11737.6018 1676.80025 391.253392  32.157813           
CLARK      09-6月 -81     11698.6018 1671.22882 389.953392 32.0509637           
SCOTT      13-7月 -87     703435.602   100490.8 23447.8534 1927.22083           
KING       17-11月-81     11537.6018 1648.22882 384.586725 31.6098678           
TURNER     08-9月 -81     11607.6018 1658.22882 386.920059 31.8016487           
ADAMS      13-7月 -87     703435.602   100490.8 23447.8534 1927.22083           

ENAME      HIREDATE               天       星期         月         年           
---------- -------------- ---------- ---------- ---------- ----------           
JAMES      03-12月-81     11521.6018 1645.94311 384.053392 31.5660322           
FORD       03-12月-81     11521.6018 1645.94311 384.053392 31.5660322           
MILLER     23-1月 -82     11470.6018 1638.65739 382.353392 31.4263062           

已选择14行。

SQL> select sysdate+hiredate from emp;
select sysdate+hiredate from emp
              *
第 1 行出现错误: 
ORA-00975: 不允许日期 + 日期 


SQL> host cls

SQL> --last_day 日期所在月份的最后一天
SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDA                                                                  
--------------                                                                  
30-6月 -13                                                                      

SQL> --MONTHS_BETWEEN 返回两个日期相差的月数
SQL> select ename,hiredate,(sysdate-hiredate)/30 一,MONTHS_BETWEEN(sysdate,hiredate) 二
  2  from emp;

ENAME      HIREDATE               一         二                                 
---------- -------------- ---------- ----------                                 
SMITH      17-12月-80     395.753475 390.084008                                 
ALLEN      20-2月 -81     393.586809 387.987234                                 
WARD       22-2月 -81     393.520142 387.922718                                 
JONES      02-4月 -81     392.220142 386.567879                                 
MARTIN     28-9月 -81     386.253475  380.72917                                 
BLAKE      01-5月 -81     391.253475 385.600137                                 
CLARK      09-6月 -81     389.953475 384.342073                                 
SCOTT      13-7月 -87     23447.8535  23111.213                                 
KING       17-11月-81     384.586809 379.084008                                 
TURNER     08-9月 -81     386.920142 381.374331                                 
ADAMS      13-7月 -87     23447.8535  23111.213                                 

ENAME      HIREDATE               一         二                                 
---------- -------------- ---------- ----------                                 
JAMES      03-12月-81     384.053475 378.535621                                 
FORD       03-12月-81     384.053475 378.535621                                 
MILLER     23-1月 -82     382.353475  376.89046                                 

已选择14行。

SQL> --ADD_MONTHS: 加上若干个月
SQL> select ADD_MONTHS(sysdate,100) from dual;

ADD_MONTHS(SYS                                                                  
--------------                                                                  
19-10月-21                                                                      

SQL> host cls

SQL> --next_day
SQL> select next_day(sysdate,'星期三') from dual;

NEXT_DAY(SYSDA                                                                  
--------------                                                                  
26-6月 -13                                                                      

SQL> select next_day(sysdate,'星期四') from dual;

NEXT_DAY(SYSDA                                                                  
--------------                                                                  
20-6月 -13                                                                      

SQL> --提示: next_day应用: 每个星期一做数据备份

SQL> select next_day(sysdate,'礼拜四') from dual;
select next_day(sysdate,'礼拜四') from dual
                        *
第 1 行出现错误: 
ORA-01846: 周中的日无效 


SQL> host cls

SQL> select round(sysdate,'month'),  round(sysdate,'year') from dual;

ROUND(SYSDATE, ROUND(SYSDATE,                                                   
-------------- --------------                                                   
01-7月 -13     01-1月 -13     
SQL> --隐式类型转换的前提:该转换对象是可以转换的
SQL> --隐式类型转换由Oracle自动完成
SQL> --显式类型转换:不能由Oracle自动完成,并且要转换的对象有时候是不能自动转换的
SQL> --比如number-->varchar,需要number调用to_char函数
SQL> --tochar函数,按照某个具体的日期,返回一个字符串结果
SQL> --查询:2015-09-30 09:44:23 今天是星期三
SQL> --to_char函数的使用格式为:to_char(date,'modle')
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day')
  2  from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI                                              
----------------------------------                                              
2015-09-30 09:46:25今天是星期三                                                 

SQL> --如上面的例子所示,我们在格式模版里面使用了我们自己的字符串,这时候需要我们在自己使用的字符串上面加双引号
SQL> --使用to_char函数查询员工的薪水,要求的格式:两位小数,千分号,当地货币符号
SQL> select to_char(sal,'L9,999.99') from emp;

TO_CHAR(SAL,'L9,999                                                             
-------------------                                                             800.001,600.001,250.002,975.001,250.002,850.002,450.003,000.005,000.001,500.001,100.00                                                             

TO_CHAR(SAL,'L9,999                                                             
-------------------                                                             950.003,000.001,300.00                                                             

已选择14行。

SQL> --如上所示,其中用9表示有多少位数字,用千分号表示分隔符,在数字的最前面使用大写英文字母L表示当地货币
SQL> --to_char跟to_number/to_date的使用方法类似,用过了to_char剩下的都差不多的用法
SQL> host cls

SQL> --通用函数
SQL> --nvl(a,b)和nvl2(a,b,c)
SQL> --其中nvl我们在之前已经使用过,在这里我们用一下nvl2
SQL> --括号内参数的意思为:判断a是否为null,如果为空,则返回c,不为null返回b
SQL> --查询员工的奖金

SQL> select nvl2(comm,comm,0) from emp;

NVL2(COMM,COMM,0)                                                               
-----------------                                                               
                0                                                               
              300                                                               
              500                                                               
                0                                                               
             1400                                                               
                0                                                               
                0                                                               
                0                                                               
                0                                                               
                0                                                               
                0                                                               

NVL2(COMM,COMM,0)                                                               
-----------------                                                               
                0                                                               
                0                                                               
                0                                                               

已选择14行。

SQL> host cls

SQL> --nullif(a,b)表示a与b比较,如果相等,返回null;不相等返回a
SQL> --注意:通用函数是适用于所有数据类型以及空值
SQL> select nullif('abc','abc') from dual;

NUL                                                                             
---                                                                             


SQL> --不相等的例子
SQL> select nullif('abc','abcd') from dual;

NUL                                                                             
---                                                                             
abc                                                                             

SQL> --coalesce(..)表示从参数列左往右返回第一个不为空的值
SQL> select sal,comm,coalesce(sal,comm)
  2  from emp;

       SAL       COMM COALESCE(SAL,COMM)                                        
---------- ---------- ------------------                                        
       800                           800                                        
      1600        300               1600                                        
      1250        500               1250                                        
      2975                          2975                                        
      1250       1400               1250                                        
      2850                          2850                                        
      2450                          2450                                        
      3000                          3000                                        
      5000                          5000                                        
      1500          0               1500                                        
      1100                          1100                                        

       SAL       COMM COALESCE(SAL,COMM)                                        
---------- ---------- ------------------                                        
       950                           950                                        
      3000                          3000                                        
      1300                          1300                                        

已选择14行。

SQL> host cls

SQL> --单行函数的最后一个内容:条件表达式
SQL> --如果需要用到if-then-else逻辑的时候,就需要考虑使用条件表达式
SQL> --条件表达式有两种实现方法,第一种为case表达式(sql的标准),第二种为decode函数(oracle自己的语法,比较简洁)
SQL> --我们先用case函数
SQL> --帮员工涨薪水,如果为总裁+100,如果为经理+800,其他+400
SQL> select ename,job,sal 涨前薪水,
  2         case job when 'PRESIDENT' then sal+1000
  3              when 'MANAGER' then sal+800
  4              else sal+400
  5  end 涨后薪水
  6  from emp;

ENAME      JOB         涨前薪水   涨后薪水                                      
---------- --------- ---------- ----------                                      
SMITH      CLERK            800       1200                                      
ALLEN      SALESMAN        1600       2000                                      
WARD       SALESMAN        1250       1650                                      
JONES      MANAGER         2975       3775                                      
MARTIN     SALESMAN        1250       1650                                      
BLAKE      MANAGER         2850       3650                                      
CLARK      MANAGER         2450       3250                                      
SCOTT      ANALYST         3000       3400                                      
KING       PRESIDENT       5000       6000                                      
TURNER     SALESMAN        1500       1900                                      
ADAMS      CLERK           1100       1500                                      

ENAME      JOB         涨前薪水   涨后薪水                                      
---------- --------- ---------- ----------                                      
JAMES      CLERK            950       1350                                      
FORD       ANALYST         3000       3400                                      
MILLER     CLERK           1300       1700                                      

已选择14行。

SQL> set pagesiez 20;
SP2-0158: 未知的 SET 选项 "pagesiez"
SQL> ed
已写入 file afiedt.buf

  1  select ename,job,sal 涨前薪水,
  2         case job when 'PRESIDENT' then sal+1000
  3              when 'MANAGER' then sal+800
  4              else sal+400
  5  end 涨后薪水
  6* from emp


SQL> --我们使用decode函数来实现上面的例子

SQL> select ename,job,sal 涨前薪水,
  2         decode(job,'PERSIDENT',sal+1000,'MANAGER',sal+800,sal+400) 涨后薪水
  3  from emp;

ENAME      JOB         涨前薪水   涨后薪水                                      
---------- --------- ---------- ----------                                      
SMITH      CLERK            800       1200                                      
ALLEN      SALESMAN        1600       2000                                      
WARD       SALESMAN        1250       1650                                      
JONES      MANAGER         2975       3775                                      
MARTIN     SALESMAN        1250       1650                                      
BLAKE      MANAGER         2850       3650                                      
CLARK      MANAGER         2450       3250                                      
SCOTT      ANALYST         3000       3400                                      
KING       PRESIDENT       5000       5400                                      
TURNER     SALESMAN        1500       1900                                      
ADAMS      CLERK           1100       1500                                      
JAMES      CLERK            950       1350                                      
FORD       ANALYST         3000       3400                                      
MILLER     CLERK           1300       1700                                      

已选择14行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值