现在的位置: 首页 > 综合 > 正文

ORACLE单行函数与多行函数之六:通用函数示例

2013年01月13日 ⁄ 综合 ⁄ 共 3684字 ⁄ 字号 评论关闭

主要实验了几个常用的判断NULL值及DECODE的函数。

1.NVL(a,b):判断A字段的内容为null时,运算结果为指定的值。A不为NULL,则显示A的值。

如果COMM的值为NULL,则返回显示为200.
BYS@bys1>Select COMM,NVL(COMM,200) From EMP where rownum<3;
      COMM NVL(COMM,200)
---------- -------------
                     200
       300           300

2.NVL2(a,b,c):如果第一个表达式a的值不为null,显示表达式2的值;如果a为null,显示表达式C的值。
如果comm值不为NULL,返回678;如果为NULL,返回999.
BYS@bys1>select sal,comm,nvl2(comm,678,999) from emp where rownum<5;
       SAL       COMM NVL2(COMM,678,999)
---------- ---------- ------------------
       800                           999
      1600        300                678
      1250        500                678
      2975                           999

3.NULLIF:如果前后两个表达式的内容相等的,那就返回null,否则,返回第一个表达式的值

如果工资sal=3000,则返回NULL值。
BYS@bys1>select sal,ename,nullif(sal,3000) from emp order by 1 desc;
       SAL ENAME      NULLIF(SAL,3000)
---------- ---------- ----------------
      5000 KING                   5000
      3000 FORD
      3000 SCOTT

      2975 JONES                  2975
      2850 BLAKE                  2850
      2450 CLARK                  2450
      1600 ALLEN                  1600
      1500 TURNER                 1500
      1300 MILLER                 1300
      1250 WARD                   1250
      1250 MARTIN                 1250
      1100 ADAMS                  1100
       950 JAMES                   950

4.COALESCE函数:用来匹配多个字段的值,如果表达式1的值为null,显示表达式2的值,如果表达式2也为空,显示表达式3的值,依次类推

如下语句是,如果COMM是空,则显示MGR。如果COMM也为空,则显示EMPNO。如果EMPNO也为空,则显示886.

KING的COMM是NULL值,MGR也是NULL,所以返回显示了工号7839。

SMITH的COMM是NULL值,MGR为值,所以返回显示了MGR的号码:7902

BYS@bys1>select ename,empno,mgr,comm,coalesce(comm,mgr,empno,886) from emp;

ENAME           EMPNO        MGR       COMM COALESCE(COMM,MGR,EMPNO,886)
---------- ---------- ---------- ---------- ----------------------------
SMITH            7369       7902                                    7902
ALLEN            7499       7698        300                          300
WARD             7521       7698        500                          500
JONES            7566       7839                                    7839
MARTIN           7654       7698       1400                         1400
BLAKE            7698       7839                                    7839
CLARK            7782       7839                                    7839
SCOTT            7788       7566                                    7566
KING             7839                                               7839
TURNER           7844       7698          0                            0
ADAMS            7876       7788                                    7788
JAMES            7900       7698                                    7698
FORD             7902       7566                                    7566

MILLER           7934       7782                                    7782

5.decode函数,DECODE函数可以直接对NULL做等值判断

decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF

如下两条语句,decode(5,1,'ok',2)中,如5等于1,返回OK。不等于1,返回2

BYS@bys1>select decode(5,1,'ok',2) from dual;
D
-
2
BYS@bys1>select decode(1,1,'ok',2) from dual;
DE
--
ok
如下的表:decode(xx,9,1,0),即XX行的值为9,则显示1,不为9,则显示0.

BYS@bys1>select * from aa;
        XX
----------
         9
         5
         5
         9
         5
         9
         9
7 rows selected.
BYS@bys1>select decode(xx,9,1,0),decode(xx,5,1,0) from aa;
DECODE(XX,9,1,0) DECODE(XX,5,1,0)
---------------- ----------------
               1                0
               0                1
               0                1
               1                0
               0                1
               1                0

可用于统计等于某个数值的列总共有多少行。分组函数不统计NULL值

BYS@bys1>select count(decode(xx,9,1,null)),count(decode(xx,5,1,0)) from aa;
COUNT(DECODE(XX,9,1,NULL)) COUNT(DECODE(XX,5,1,0))
-------------------------- -----------------------
                         4                       7

抱歉!评论已关闭.