Oracle學習(3):單行函數

單行函數


單行函數:

操作數據對象
接受參數返回一個結果
只對一行進行變換
每行返回一個結果
可以轉換數據類型
可以嵌套
參數可以是一列或一個值





*************************************************************************************************************************************************

字符函數



*************************************************************************************************************************************************

SQL> --字符函數

大小寫控制函數




SQL> select lower('HELLO World') 轉小寫, upper('HELLO World') 轉大寫, initcap('hello world') 首字母大寫
  2  from dual;


轉小寫      轉大寫      首字母大寫                                                                                                                    
----------- ----------- -----------                                                                                                                   
hello world HELLO WORLD Hello World                                                                                                                   


SQL> --substr:求子串
SQL> select substr('Hello World',4) from dual;


SUBSTR('                                                                                                                                              
--------                                                                                                                                              
lo World                                                                                                                                              


SQL> select substr('Hello World',4,5) from dual;


SUBST                                                                                                                                                 
-----                                                                                                                                                 

lo Wo             


                                                                                                                                    

字符控制函數



字符數字節數

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:在母串中查找子串,如果找到返回下標(從1開始);否則返回0
SQL> select instr('Hello World','ll') from dual;


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

                       3                                                                                                                              


左右填充


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


左填充     右填充                                                                                                                                     
---------- ----------                                                                                                                                 
******abcd abcd******                                                                                                                                 


SQL> host cls


去掉前後指定的字符

SQL> --trim:去掉前後指定的字符

SQL> select trim('H' from  'Hello WorldH') from dual;


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


replace:替換

SQL> --replace:替換
SQL> select replace('Hello World','l','*') from dual;


REPLACE('HE                                                                                                                                           
-----------                                                                                                                                           
He**o Wor*d                                                                                                                                           


SQL> host cls


數字函數

SQL> --數值函數



四捨五入round

SQL> select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0)  三, round(45.926,-1) 四,round(45.926,-2) 五
  2  from dual;


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


SQL> ed
已寫入 file afiedt.buf

截斷函數,TRUNC


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


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


SQL> host cls


日期函數

SQL> --日期函數

           

            Oracle 中的日期型數據實際含有兩個值: 日期和時間。

            默認的日期格式是 DD-MON-RR


SQL> select sysdate from dual;

SYSDATE                                                                                                                                               
--------------                                                                                                                                        
25-3月 -12                                                                                                                                            


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


昨天           今天           明天                                                                                                                    
-------------- -------------- --------------                                                                                                          
24-3月 -12     25-3月 -12     26-3月 -12                                                                                                              


SQL> host cls

粗略計算辦法日期查詢

         在日期上加上或減去一個數字結果仍爲日期。
         兩個日期相減返回日期之間相差的天數
         可以用數字除24來向日期中加上或減去小時。


SQL> --查詢員工的工齡:天 星期 月 年

SQL> select ename,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,(sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年
  2  from emp;


ENAME            天       星期         月         年                                                                                                  
-------- ---------- ---------- ---------- ----------                                                                                                  
SMITH    11421.6015 1631.65736  380.72005 31.2920589                                                                                                  
ALLEN    11356.6015 1622.37164 378.553383 31.1139767                                                                                                  
WARD     11354.6015 1622.08593 378.486717 31.1084973                                                                                                  
JONES    11315.6015  1616.5145 377.186717  31.001648                                                                                                  
MARTIN   11136.6015 1590.94307  371.22005  30.511237                                                                                                  
BLAKE    11286.6015 1612.37164  376.22005 30.9221959                                                                                                  
CLARK    11247.6015 1606.80021  374.92005 30.8153466                                                                                                  
SCOTT     9022.6015 1288.94307 300.753383 24.7194562                                                                                                  
KING     11086.6015 1583.80021 369.553383 30.3742507                                                                                                  
TURNER   11156.6015 1593.80021 371.886717 30.5660315                                                                                                  
ADAMS     9022.6015 1288.94307 300.753383 24.7194562                                                                                                  
JAMES    11070.6015  1581.5145  369.02005 30.3304151                                                                                                  
FORD     11070.6015  1581.5145  369.02005 30.3304151                                                                                                  
MILLER   11019.6015 1574.22879  367.32005 30.1906891                                                                                                  


已選擇14行。


SQL> select sysdate+hiredate from emp;
select sysdate+hiredate from emp
              *
第 1 行出現錯誤: 
ORA-00975: 不允許日期 + 日期 



利用oracle函數來精確查詢日期



SQL> host cls


SQL> --使用months_between計算工齡
SQL> select ename,(sysdate-hiredate)/30 方式一,months_between(sysdate,hiredate) 方式二
  2  from emp;


ENAME        方式一     方式二                                                                                                                        
-------- ---------- ----------                                                                                                                        
SMITH    380.720133 375.277548                                                                                                                        
ALLEN    378.553466 373.180774                                                                                                                        
WARD       378.4868 373.116258                                                                                                                        
JONES      377.1868 371.761419                                                                                                                        
MARTIN   371.220133 365.922709                                                                                                                        
BLAKE    376.220133 370.793677                                                                                                                        
CLARK    374.920133 369.535613                                                                                                                        
SCOTT    300.753466  296.40658                                                                                                                        
KING     369.553466 364.277548                                                                                                                        
TURNER     371.8868 366.567871                                                                                                                        
ADAMS    300.753466  296.40658                                                                                                                        
JAMES    369.020133 363.729161                                                                                                                        
FORD     369.020133 363.729161                                                                                                                        
MILLER   367.320133    362.084                                                                                                                        


已選擇14行。


SQL> --add_months:加上若干個月
SQL> select add_months(sysdate,123) from dual;


ADD_MONTHS(SYS                                                                                                                                        
--------------                                                                                                                                        
25-6月 -22                                                                                                                                            


SQL> select last_day(sysdate) from dual;    某月最後一天


LAST_DAY(SYSDA                                                                                                                                        
--------------                                                                                                                                        
31-3月 -12                                                                                                                                            


SQL> select next_day(sysdate,'星期日') from dual;     下一個星期日


NEXT_DAY(SYSDA                                                                                                                                        
--------------                                                                                                                                        
01-4月 -12                                                                                                                                            


SQL> select next_day(sysdate,'禮拜天') from dual;
select next_day(sysdate,'禮拜天') from dual
                        *
第 1 行出現錯誤: 
ORA-01846: 週中的日無效 




SQL> host cls



SQL> --對日期進行四捨五入
SQL> select round(sysdate,'MONTH'), round(sysdate,'YEAR') from dual;


ROUND(SYSDATE, ROUND(SYSDATE,                                                                                                                         
-------------- --------------                                                                                                                         
01-4月 -12     01-1月 -12                                                                                                                             



轉換函數




隱式轉換

SQL> --隱式數據類型轉換前提:被轉換對象是可以轉換的





顯式轉換:






to_char對日期的轉換



*****************************************************************************************************************************




*****************************************************************************************************************************






SQL> --2012-3月-25今天是星期日
SQL> --2012-3月-25 14:44:00 今天是星期日
SQL> select to_char(sysdate,'yyyy-mon-dd hh24:mi:mm"今天是" day') from dual;


TO_CHAR(SYSDATE,'YYYY-MON-DDHH24:MI:MM"今                                                                                                             
-----------------------------------------                                                                                                             
2012-3月 -25 14:46:03今天是 星期日                                                                                                                    


SQL> host cls


SQL> select * from emp;


     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                   
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                   
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                   
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                   
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                   
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                   
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                   
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                   
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                   
      7788 SCOTT    ANALYST         7566 13-7月 -87      3000                    20                                                                   
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                   
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                   
      7876 ADAMS    CLERK           7788 13-7月 -87      1100                    20                                                                   
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                   
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                   
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                   


已選擇14行。



to_char對數字的轉換




SQL> --查詢員工的薪水:貨幣代碼,千位符,兩位小數
SQL> select to_char(sal,'L9,999.99') from emp;


TO_CHAR(SAL,'L9,999                                                                                                                                   
-------------------                                                                                                                                   
           ¥800.00                                                                                                                                   
         ¥1,600.00                                                                                                                                   
         ¥1,250.00                                                                                                                                   
         ¥2,975.00                                                                                                                                   
         ¥1,250.00                                                                                                                                   
         ¥2,850.00                                                                                                                                   
         ¥2,450.00                                                                                                                                   
         ¥3,000.00                                                                                                                                   
         ¥5,000.00                                                                                                                                   
         ¥1,500.00                                                                                                                                   
         ¥1,100.00                                                                                                                                   
           ¥950.00                                                                                                                                   
         ¥3,000.00                                                                                                                                   
         ¥1,300.00                                                                                                                                   


已選擇14行。


SQL> select * from v$nls_parameters;


PARAMETER                                                        VALUE                                                                                
---------------------------------------------------------------- ----------------------------------------------------------------                     
NLS_LANGUAGE                                                     SIMPLIFIED CHINESE                                                                   
NLS_TERRITORY                                                    CHINA                                                                                
NLS_CURRENCY                                                     ¥                                                                                   
NLS_ISO_CURRENCY                                                 CHINA                                                                                
NLS_NUMERIC_CHARACTERS                                           .,                                                                                   
NLS_CALENDAR                                                     GREGORIAN                                                                            
NLS_DATE_FORMAT                                                  DD-MON-RR                                                                            
NLS_DATE_LANGUAGE                                                SIMPLIFIED CHINESE                                                                   
NLS_CHARACTERSET                                                 ZHS16GBK                                                                             
NLS_SORT                                                         BINARY                                                                               
NLS_TIME_FORMAT                                                  HH.MI.SSXFF AM                                                                       
NLS_TIMESTAMP_FORMAT                                             DD-MON-RR HH.MI.SSXFF AM                                                             
NLS_TIME_TZ_FORMAT                                               HH.MI.SSXFF AM TZR                                                                   
NLS_TIMESTAMP_TZ_FORMAT                                          DD-MON-RR HH.MI.SSXFF AM TZR                                                         
NLS_DUAL_CURRENCY                                                ¥                                                                                   
NLS_NCHAR_CHARACTERSET                                           AL16UTF16                                                                            
NLS_COMP                                                         BINARY                                                                               


PARAMETER                                                        VALUE                                                                                
---------------------------------------------------------------- ----------------------------------------------------------------                     
NLS_LENGTH_SEMANTICS                                             BYTE                                                                                 
NLS_NCHAR_CONV_EXCP                                              FALSE                                                                                


已選擇19行。


SQL> host cls



通用函數

這些函數適用於任何數據類型,同時也適用於空值

NVL (expr1, expr2)
NVL2 (expr1, expr2, expr3)
NULLIF (expr1, expr2)
COALESCE (expr1, expr2, ..., exprn)



SQL> --通用函數
SQL> --NVL2 (expr1, expr2, expr3)
SQL> --當expr1爲null時,返回expr3;否則返回expr2
SQL> select empno,ename,sal,comm,sal*12+nvl2(comm,comm,0)
  2  from emp;


     EMPNO ENAME      SAL       COMM SAL*12+NVL2(COMM,COMM,0)                                                                                         
---------- -------- ----- ---------- ------------------------                                                                                         
      7369 SMITH      800                                9600                                                                                         
      7499 ALLEN     1600        300                    19500                                                                                         
      7521 WARD      1250        500                    15500                                                                                         
      7566 JONES     2975                               35700                                                                                         
      7654 MARTIN    1250       1400                    16400                                                                                         
      7698 BLAKE     2850                               34200                                                                                         
      7782 CLARK     2450                               29400                                                                                         
      7788 SCOTT     3000                               36000                                                                                         
      7839 KING      5000                               60000                                                                                         
      7844 TURNER    1500          0                    18000                                                                                         
      7876 ADAMS     1100                               13200                                                                                         
      7900 JAMES      950                               11400                                                                                         
      7902 FORD      3000                               36000                                                                                         
      7934 MILLER    1300                               15600                                                                                         


已選擇14行。


SQL> host cls


SQL> --NULLIF (expr1, expr2):當expr1=expr2時,返回null;否則返回expr1
SQL> select nullif('abc','abc') from dual;


NUL                                                                                                                                                   
---                                                                                                                                                   
                                                                                                                                                      


SQL> select nullif('abc','abcd') from dual;


NUL                                                                                                                                                   
---                                                                                                                                                   
abc                                                                                                                                                   


SQL> --COALESCE (expr1, expr2, ..., exprn):找到參數列表中,第一個不爲null的值
SQL> select comm,sal,COALESCE(comm,sal) from emp;


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


已選擇14行。


SQL> host cls




條件表達式

在SQL語句中使用IF-THEN-ELSE 邏輯

使用兩種方法:
      •CASE表達式:SQL99的語法,類似Basic,比較繁瑣
      •DECODE函數:Oracle自己的語法,類似Java,比較簡介


SQL> --給員工漲工資:總裁1000 經理800 其他400
SQL> select * from emp;


     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                   
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                   
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                   
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                   
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                   
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                   
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                   
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                   
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                   
      7788 SCOTT    ANALYST         7566 13-7月 -87      3000                    20                                                                   
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                   
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                   
      7876 ADAMS    CLERK           7788 13-7月 -87      1100                    20                                                                   
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                   
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                   
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                   


已選擇14行。



case表達式

SQL> select empno,ename,job,sal 漲前薪水,case job when 'PRESIDENT' then sal+1000
  2                                               when 'MANAGER' then sal+800
  3                                               else sal+400
  4                                      end 漲後薪水
  5  from emp;


     EMPNO ENAME    JOB         漲前薪水   漲後薪水                                                                                                   
---------- -------- --------- ---------- ----------                                                                                                   
      7369 SMITH    CLERK            800       1200                                                                                                   
      7499 ALLEN    SALESMAN        1600       2000                                                                                                   
      7521 WARD     SALESMAN        1250       1650                                                                                                   
      7566 JONES    MANAGER         2975       3775                                                                                                   
      7654 MARTIN   SALESMAN        1250       1650                                                                                                   
      7698 BLAKE    MANAGER         2850       3650                                                                                                   
      7782 CLARK    MANAGER         2450       3250                                                                                                   
      7788 SCOTT    ANALYST         3000       3400                                                                                                   
      7839 KING     PRESIDENT       5000       6000                                                                                                   
      7844 TURNER   SALESMAN        1500       1900                                                                                                   
      7876 ADAMS    CLERK           1100       1500                                                                                                   
      7900 JAMES    CLERK            950       1350                                                                                                   
      7902 FORD     ANALYST         3000       3400                                                                                                   
      7934 MILLER   CLERK           1300       1700                                                                                                   


已選擇14行。


decode函數


SQL> select empno,ename,job,sal 漲前薪水,decode(job,'PRESIDENT',sal+1000,
  2                                                 'MANAGER', sal+800,
  3                                                  sal+400) 漲後薪水
  4  from emp;


     EMPNO ENAME    JOB         漲前薪水   漲後薪水                                                                                                   
---------- -------- --------- ---------- ----------                                                                                                   
      7369 SMITH    CLERK            800       1200                                                                                                   
      7499 ALLEN    SALESMAN        1600       2000                                                                                                   
      7521 WARD     SALESMAN        1250       1650                                                                                                   
      7566 JONES    MANAGER         2975       3775                                                                                                   
      7654 MARTIN   SALESMAN        1250       1650                                                                                                   
      7698 BLAKE    MANAGER         2850       3650                                                                                                   
      7782 CLARK    MANAGER         2450       3250                                                                                                   
      7788 SCOTT    ANALYST         3000       3400                                                                                                   
      7839 KING     PRESIDENT       5000       6000                                                                                                   
      7844 TURNER   SALESMAN        1500       1900                                                                                                   
      7876 ADAMS    CLERK           1100       1500                                                                                                   
      7900 JAMES    CLERK            950       1350                                                                                                   
      7902 FORD     ANALYST         3000       3400                                                                                                   
      7934 MILLER   CLERK           1300       1700                                                                                                   


已選擇14行。


SQL> spool off
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章