oracle 的单行函数

1、字符函数:initcap(注意一下)

SQL> select lower('hellO WORld') 转小写,upper('hellO WORld') 转大写,initcap('hello world') 首字母大写
  2   from dual;

转小写                 转大写                 首字母大写
---------------------- ---------------------- ----------------------
hello world            HELLO WORLD            Hello World
SQL> select lower('hellO WORld') 转大写,upper('hellO WORld') 转小写,initcap('hello worlD') 首字母大写 from dual;

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

2、substr(a,b) 从a中,第b位开始取,取右边所有的字符: 可以取到第b位

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

SUBSTR('HELLOWOR
----------------
lo World
SQL> select substr(1111,2) from dual;     对数字也适用

SUBSTR
------
111

substr(a,b,c) 从a中,第b位开始取,取c位:

SQL> select substr('Hello World',4,4)  from dual;            空格也算一位

SUBSTR('
--------
lo W

3、length 字符数 lengthb 字节数:

SQL> select length('Hello World') 字符数, lengthb('Hello World') 字节数 from dual;

    字符数     字节数
---------- ----------
        11         11
SQL> select length('北京') 字符数, lengthb('北京') 字节数 from dual;

    字符数     字节数
---------- ----------
         2          6

4、在母串中查找子串,找到返回下标(从1开始),否则返回0:

SQL> select instr('Hello World','ll')  from dual;

INSTR('HELLOWORLD','LL')
------------------------
                       3
SQL> select instr('Hello World','lle')  from dual;

INSTR('HELLOWORLD','LLE')
-------------------------
                        0

5、lpad 左填充  rpad 右填充:以及其他填充

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

左                   右
-------------------- --------------------
******abcd           abcd******
SQL> select replace('Hello World','l','*') from dual;

REPLACE('HELLOWORLD','
----------------------
He**o Wor*d

6、trim 去掉前后指定的字符:

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

TRIM('H'FROM'HELLOWO
--------------------
ello World

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

TRIM('L'FROM'HELLOWORLDH
------------------------
Hello WorldH

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

TRIM('H'FROM'HELLOWORLDH
------------------------
ello WorldHe

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

TRIM('H'FROM'EHELLOWORLD
------------------------
eHello World

 7、select replace('Hello World','l','*') from dual;

SQL> select replace('Hello World','l','*') from dual;

REPLACE('HELLOWORLD','
----------------------
He**o Wor*d

 8、round (xx,数字)前面的xx进行小数点数字前后四舍五入:

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

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

9、日期函数  sysdate (系统日期):

SQL> select sysdate from dual;

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

TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS'
--------------------------------------
2018-09-06 08:31:42
SQL> select systimestamp from dual;              时间戳

SYSTIMESTAMP
---------------------------------------------------------------------------
06-9月 -18 08.32.08.704000 上午 +08:00
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') from dual;

TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DDHH24:MI:SS*FF')
----------------------------------------------------------
2018-09-06 08:32:55*607000

 昨天,今天,明天:

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

昨天           今天           明天
-------------- -------------- --------------
08-9月 -18     09-9月 -18     10-9月 -18

员工的工龄

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

ENAME                HIREDATE               天       星期         月         年
-------------------- -------------- ---------- ---------- ---------- ----------
SMITH                17-12月-80     13780.3844 1968.62634 459.346146 37.7544777
ALLEN                20-2月 -81     13715.3844 1959.34063 457.179479 37.5763955
WARD                 22-2月 -81     13713.3844 1959.05491 457.112813 37.5709161
JONES                02-4月 -81     13674.3844 1953.48348 455.812813 37.4640668
MARTIN               28-9月 -81     13495.3844 1927.91205 449.846146 36.9736558
BLAKE                01-5月 -81     13645.3844 1949.34063 454.846146 37.3846147
CLARK                09-6月 -81     13606.3844  1943.7692 453.546146 37.2777654
SCOTT                19-4月 -87     11466.3844 1638.05491 382.212813 31.4147517
KING                 17-11月-81     13445.3844  1920.7692 448.179479 36.8366695
TURNER               08-9月 -81     13515.3844  1930.7692 450.512813 37.0284503
ADAMS                23-5月 -87     11432.3844 1633.19777 381.079479  31.321601

ENAME                HIREDATE               天       星期         月         年
-------------------- -------------- ---------- ---------- ---------- ----------
JAMES                03-12月-81     13429.3844 1918.48348 447.646146 36.7928339
FORD                 03-12月-81     13429.3844 1918.48348 447.646146 36.7928339
MILLER               23-1月 -82     13378.3844 1911.19777 445.946146 36.6531079

已选择14行。

日期的最后一天:

SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDA
--------------
30-9月 -18

MONTHS_BETWEEN 计算工龄

 

SQL> select (sysdate-hiredate)/30 一,MONTHS_BETWEEN(sysdate,hiredate) 二
  2  from emp;

        一         二
---------- ----------
459.346217 452.754404
457.179551  450.65763
457.112884 450.593113
455.812884 449.238275
449.846217 443.399565
454.846217 448.270533
453.546217        447
382.212884 376.689888
448.179551 441.754404
450.512884 444.044726
381.079551 375.560855

        一         二
---------- ----------
447.646217 441.206017
447.646217 441.206017
445.946217 439.560855

已选择14行。

 114月后:

SQL> select add_months(sysdate,114) from dual;

ADD_MONTHS(SYS
--------------
09-3月 -28

从今天开始算(2018.9.9星期一),下一个星期一:

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

NEXT_DAY(SYSDA
--------------
10-9月 -18

对日期进行四舍五入:

select round(sysdate,'month') 一,round(sysdate,'year') 二 from dual;

  一             二
-------------- --------------
01-9月 -18 01-1月 -19

显式转换:

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

TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS"今天是"DAY')
--------------------------------------------------------------------------------
2018-09-09 09:27:35今天是星期日

查询员工的薪水: 货币符号,两位小数,千位符:

SQL> select sal, to_char(sal,'L9,999.99') from emp;

       SAL TO_CHAR(SAL,'L9,999.99')
---------- --------------------------------------
       800800.00
      16001,600.00
      12501,250.00
      29752,975.00
      12501,250.00
      28502,850.00
      24502,450.00
      30003,000.00
      50005,000.00
      15001,500.00
      11001,100.00

       SAL TO_CHAR(SAL,'L9,999.99')
---------- --------------------------------------
       950950.00
      30003,000.00
      13001,300.00

已选择14行。

nvl2(a,b,c) 当a=null时,返回c,否则返回b:

SQL> select sal,nvl(comm,0),sal*12+nvl2(comm,comm,0)  from emp;

       SAL NVL(COMM,0) SAL*12+NVL2(COMM,COMM,0)
---------- ----------- ------------------------
       800           0                     9600
      1600         300                    19500
      1250         500                    15500
      2975           0                    35700
      1250        1400                    16400
      2850           0                    34200
      2450           0                    29400
      3000           0                    36000
      5000           0                    60000
      1500           0                    18000
      1100           0                    13200

       SAL NVL(COMM,0) SAL*12+NVL2(COMM,COMM,0)
---------- ----------- ------------------------
       950           0                    11400
      3000           0                    36000
      1300           0                    15600

已选择14行。

nullif(a,b) 当a=b时,返回null,否则返回a:

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

NULLIF
------
SQL> select nullif('abc','abdc') from dual;

NULLIF
------
abc

COALESCE 从左至右找到第一个不为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

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

已选择14行。

根据职位涨工资 总裁1000 经理800 其他400:

SQL> ed
已写入 file afiedt.buf

  1  select 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
SQL> /

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> ed
已写入 file afiedt.buf

  1  select ename,job,sal 涨前薪水,decode(job,'PRESIDENT',sal+1000,
  2                                               'MANAGER', sal+800,
  3                                                         sal+400)涨后薪水
  4*     from emp
SQL> /

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行。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---

posted on 2018-09-09 19:32  孙崇武  阅读(189)  评论(0编辑  收藏  举报

导航