Oracle常用單行函數

單行函數:每處理一條記錄返回一條結果.


字符函數

  • LOWER    :    轉小寫
    SQL> select lower(ename) from emp;
    
    LOWER(ENAME)
    --------------------
    smith
    allen
    ward
  • UPPER   :    轉大寫
    SQL> select upper(ename) from emp;
    
    UPPER(ENAME)
    --------------------
    SMITH
    ALLEN
    WARD
  • INITCAP    :    首字母大寫
    SQL> select initcap(ename) from emp;
    
    INITCAP(ENAME)
    --------------------
    Smith
    Allen
    Ward
  • SUBSTR(a,b)    :    從b開始截取字符串a
    SQL> select substr('hello world',4) from dual;
    
    SUBSTR('HELLOWOR
    ----------------
    lo worle
  • SUBSTR(a,b,c)    :    從a字符串的第b位開始截取c長度的字符串
    SQL> select substr('hello world',4,5) from dual;
    
    SUBSTR('HE
    ----------
    lo wo
  • LENGTH(string)     :    字符長度
    SQL> select length('hello world') from dual;
    
    LENGTH('HELLOWORLD')
    --------------------
                      11
  • LENGTHB(string)    :    字節長度
    SQL> select lengthb('你好') from dual;
    
    LENGTHB('你好')
    ---------------
                  6
    
    SQL> select length('你好') from dual;
    
    LENGTH('你好')
    --------------
                 2
  • INSTR(a,b)    :    在a中查找b 沒有找到返回0
    SQL> select instr('hello world','d') from dual;
    
    INSTR('HELLOWORLD','D')
    -----------------------
                         11
    
    SQL> select instr('hello world','a') from dual;
    
    INSTR('HELLOWORLD','A')
    -----------------------
                          0

  • LPAD(a,b,c)    :    左填充(給a的左邊填充c知道滿足b長度)
    SQL> select lpad('hello world',20,'*') from dual;
    
    LPAD('HELLOWORLD',20,'*')
    ----------------------------------------
    *********hello world
    
  • RPAD(a,b,c)    :    右填充
    SQL> select rpad('hello world',20,'*') from dual;
    
    RPAD('HELLOWORLD',20,'*')
    ----------------------------------------
    hello world*********
  • TRIM(a,from,b)    :   去除指定字符(從b中去除a)  
    SQL> select trim('h'from'hello world') from dual;
    
    TRIM('H'FROM'HELLOWO
    --------------------
    ello world
  • REPLACE(a,b,c)    :    替換指定字符(將字符串中a中的b替換爲c)
    SQL> select replace('hello world','l','*') from dual;
    
    REPLACE('HELLOWORLD','
    ----------------------
    he**o wor*d

數值函數

  • ROUND(a,b)    :    四捨五入(保留a的b位小數)
    SQL> select round(4523.1354,2) 保留兩位小數,round(4523.1354,0) 保留整數,round(4523.1354,-2) 保留百位  from dual;
    
    保留兩位小數   保留整數   保留百位
    ------------ ---------- ----------
         4523.14       4523       4500
  • TRUNC(a,b)    :    截取
    SQL> select trunc(4523.1354,2)截取保留兩位小數,trunc(4523.1354,0) 截取整數,trunc(4523.1354,-2) 截取百位  from dual;
    
    截取保留兩位小數   截取整數   截取百位
    ---------------- ---------- ----------
             4523.13       4523       4500
  • MOD(a,b)    :    求餘(a%b)
    SQL> select mod(1520,30) from dual;
    
    MOD(1520,30)
    ------------
              20

日期函數

  • Oracle中的日期
    SQL> select sysdate from dual;
    
    SYSDATE
    --------------
    15-11月-17
    
    SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
    
    TO_CHAR(SYSDATE,'YYY
    --------------------
    2017-11-15
    
    SQL> select to_char(sysdate,'yyyy-mm-dd-hh24-mi-ss') from dual;
    
    TO_CHAR(SYSDATE,'YYYY-MM-DD-HH24-MI-SS
    --------------------------------------
    2017-11-15-09-48-47
  • 時間的加減(兩個時間類型可以相減但是不能相加)
    SQL> select (sysdate-1) 昨天,sysdate 今天 ,(sysdate+1) 明天 from dual;
    
    昨天           今天           明天
    -------------- -------------- --------------
    14-11月-17     15-11月-17     16-11月-17
  • MONTHS_BETWEEN(a,b)    :    兩個日期相差的月數(a-b)
    SQL> select months_between(sysdate,hiredate) from emp;
    
    MONTHS_BETWEEN(SYSDATE,HIREDATE)
    --------------------------------
                          442.948817
                          440.852043
                          440.787527
                          439.432688
                          433.593978
  • ADD_MONTHS(a,b)    :    給日期a加b月
    SQL> select add_months(sysdate,3) from dual;
    
    ADD_MONTHS(SYS
    --------------
    15-2月 -18
    
    SQL> select add_months(sysdate,-3) from dual;
    
    ADD_MONTHS(SYS
    --------------
    15-8月 -17
  • LAST_DAY(day)     :    某個日期當前月的最後一天
    SQL> select last_day(sysdate) from dual;
    
    LAST_DAY(SYSDA
    --------------
    30-11月-17
  • NEXT_DAY(a,b)    :    a日期的下一個星期b
    SQL> select next_day(sysdate,'星期一') from dual;
    
    NEXT_DAY(SYSDA
    --------------
    20-11月-17
    
    SQL> select next_day(sysdate,'星期五') from dual;
    
    NEXT_DAY(SYSDA
    --------------
    17-11月-17
  • ROUND(a,b)    :    a日期保留b,四捨五入,TRUNC同理
    SQL> select round(sysdate,'month') from dual;
    
    ROUND(SYSDATE,
    --------------
    01-11月-17
    
    SQL> select round(sysdate,'year') from dual;
    
    ROUND(SYSDATE,
    --------------
    01-1月 -18
    
    SQL> select round(sysdate,'day') from dual;
    
    ROUND(SYSDATE,
    --------------
    12-11月-17

轉換函數

  • TO_CHAR(data,'format_model')
    SQL> select to_char(sysdate,'dy') 星期幾  from dual;
    
    星期幾
    ------------------------
    星期三
    
    SQL> select to_char(sysdate,'day') 第幾天  from dual;
    
    第幾天
    ------------------------
    星期三
    
    SQL> select to_char(sysdate,'month') 第幾月  from dual;
    
    第幾月
    ----------------
    11月
    
    SQL> select to_char(sysdate,'yyyy') 第幾年  from dual;
    
    第幾年
    --------
    2017
    
    SQL> select to_char(sysdate,'year') 第幾年  from dual;
    
    第幾年
    --------------------------------------------------------------------------------
    twenty seventeen
    
    SQL> select to_char(sysdate,'mm') 第幾月  from dual;
    
    第幾
    ----
    11

    SQL> select sal from emp;
    
           SAL
    ----------
           800
          1600
          1250
          2975
          1250
          2850
          2450
          3000
          5000
          1500
          1100
    
           SAL
    ----------
           950
          3000
          1300
    
    已選擇14行。
    
    SQL> select to_char(sal,'L99,999.99') from emp;
    
    TO_CHAR(SAL,'L99,999.99')
    ----------------------------------------
               ¥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
    
    TO_CHAR(SAL,'L99,999.99')
    ----------------------------------------
               ¥950.00
             ¥3,000.00
             ¥1,300.00
    
    已選擇14行。
    注:L爲本地貨幣符號,“,”爲千位符,“.”爲小數,“9”爲精度

  • TO_NUMBER(data,'format_model')
    SQL> select to_number(sal,'L99,999.99') from (select to_char(sal,'L99,999.99') sal from emp s);
    
    TO_NUMBER(SAL,'L99,999.99')
    ---------------------------
                            800
                           1600
                           1250
                           2975
                           1250
                           2850
                           2450
                           3000
                           5000
                           1500
                           1100
    
    TO_NUMBER(SAL,'L99,999.99')
    ---------------------------
                            950
                           3000
                           1300

通用函數

  • NVL(a,b)    :    濾空(當a爲null時返回b)
    SQL> select nvl(comm,0) from emp;
    
    NVL(COMM,0)
    -----------
              0
            300
            500
              0
           1400
  • NVL2(a,b,c)    :    類型VAL(a,b) 當a爲空時返回c否則返回b
    SQL> select nvl2(comm,comm,0) from emp;
    
    NVL2(COMM,COMM,0)
    -----------------
                    0
                  300
                  500
                    0
  • NULLIF(a,b)    :    當a=b時返回null 否則返回a
    SQL> select nullif(1500,1500) from dual;
    
    NULLIF(1500,1500)
    -----------------
    
    
    SQL> select nullif(1500,160) from dual;
    
    NULLIF(1500,160)
    ----------------
                1500
  • COALESCE(expr1,expr2,....)       :      從左到右找到第一個不爲空的值否則返回空
    SQL> select coalesce(null,1,null,2) from dual;
    
    COALESCE(NULL,1,NULL,2)
    -----------------------
                          1
    
    SQL> select coalesce(null,null,null,2) from dual;
    
    COALESCE(NULL,NULL,NULL,2)
    --------------------------
                             2
    
    SQL> select coalesce(null,null,null,null) from dual;
    
    C
    -

條件表達式

  • CASE表達式(SQL99語法,較爲繁瑣)
    SQL> select ename,job,sal 漲前 ,
      2  case job when 'PERSIDENT' then sal+1000
      3  when 'MANAGER' then sal+800
      4  else sal+500
      5  end 漲後
      6  from emp;
    
    ENAME                JOB                      漲前       漲後
    -------------------- ------------------ ---------- ----------
    SMITH                CLERK                     800       1300
    ALLEN                SALESMAN                 1600       2100
    WARD                 SALESMAN                 1250       1750
    JONES                MANAGER                  2975       3775
    MARTIN               SALESMAN                 1250       1750
    BLAKE                MANAGER                  2850       3650
    CLARK                MANAGER                  2450       3250
    SCOTT                ANALYST                  3000       3500
    KING                 PRESIDENT                5000       5500
    TURNER               SALESMAN                 1500       2000
    ADAMS                CLERK                    1100       1600
    
    ENAME                JOB                      漲前       漲後
    -------------------- ------------------ ---------- ----------
    JAMES                CLERK                     950       1450
    FORD                 ANALYST                  3000       3500
    MILLER               CLERK                    1300       1800
    
    已選擇14行。
  • DECODE函數(Oracle語法,較爲簡潔)
    SQL> select ename,job,sal 漲前,
      2  decode(job,'PERSIDENT',sal+1000,
      3  'MANAGER',sal+800,
      4  sal+400) 漲後
      5  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
    
    ENAME                JOB                      漲前       漲後
    -------------------- ------------------ ---------- ----------
    JAMES                CLERK                     950       1350
    FORD                 ANALYST                  3000       3400
    MILLER               CLERK                    1300       1700
    
    已選擇14行。


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