通用函数适用于任何类型数据(包括空值),一般用于实现空值处理、条件运算和多路分支结果,下面介绍其中常用的几种:
nvl(exp1, exp2)
函数nvl(exp1, exp2)用于将空值转换为指定的具体值——先计算参数/表达式exp1的值,如果其值NULL,则返回exp2的值,否则返回exp1的值。参数exp1和exp2可以是任意类型的常量、字段或复合表达式,但二者的数据类型必须匹配。例如:
SELECT empno, ename, sal, comm, sal + nvl(comm, 0) FROM emp;
SELECT empno, ename, hiredate, nvl(hiredate, SYSDATE) FROM emp;
SELECT empno, ename, job, nvl(job, 'No job yet') FROM emp;
在数据统计中适当地使用空值转换函数nvl()可以避免空值的影响
SELECT EMPNO,ENAME,SAL,COMM,SAL+NVL(COMM,0) FROM EMP;
EMPNO ENAME SAL COMM SAL+NVL(COMM,0)
7369 SMITH 800.00 800
7499 ALLEN 1600.00 300.00 1900
7521 WARD 1250.00 500.00 1750
7566 JONES 2975.00 2975
7654 MARTIN 1250.00 1400.00 2650
7698 BLAKE 2850.00 2850

nvl2(exp1, exp2, exp3)

函数nvl2(exp1, exp2, exp3)用于实现条件表达式功能——如果表达式exp1的值不为null,则返回exp2的值,否则返回exp3的值。例如:
SELECT empno, ename, sal, comm, nvl2(comm, sal+comm, sal) total FROM emp;
EMPNO ENAME SAL COMM TOTAL
7369 SMITH 800.00 800
7499 ALLEN 1600.00 300.00 1900
7521 WARD 1250.00 500.00 1750
7566 JONES 2975.00 2975
7654 MARTIN 1250.00 1400.00 2650
7698 BLAKE 2850.00 2850
7782 CLARK 2450.00 2450
7788 SCOTT 3000.00 3000
7839 KING 5000.00 5000
7844 TURNER 1500.00 0.00 1500
7876 ADAMS 1100.00 1100
7900 JAMES 950.00 950
7902 FORD 3000.00 3000
7934 MILLER 1300.00 1300
上述SELECT语句中,表达式nvl2(comm, sal+comm, sal)的含义是如果员工的补助不为空值,则返回该员工的工资与补助数额之和做为其总收入,否则只返回工资数额做为其总收入,以避免算术加法运算受到可能出现的空值的影响,其逻辑上等价于:
SELECT empno, ename, sal, comm, sal + nvl(comm,0) total FROM emp;

nullif(exp1, exp2)

函数nullif(exp1, exp2) 用于数据等价性比较并根据比较结果返回null或其中一个被比较的数值。如果表达式exp1与exp2的值相等则返回null,否则返回exp1的值。例如:
--DROP TABLE author;
CREATE TABLE author (name VARCHAR2(20), pen_name VARCHAR2(20));
INSERT INTO author VALUES('张三', '云淡风轻');
INSERT INTO author VALUES('李四', '李四');
SELECT name 原名, nullif(pen_name, name) 化名 FROM author;
其中,SELECT语句中nullif函数的逻辑是查询作者可能存在的化名——如果作者的笔名与原名相同,则认为该作者未使用“化名”(返回NULL),否则返回其“笔名”。
原名         化名
rusky       NEVERLAND
RUSKING

coalesce (exp1, exp2, ...)

函数 coalesce (exp1, exp2, ...)用于实现数据“接合”功能——依次考察各参数表达式,遇到非null值即停止并返回该值。例如:
SELECT EMPNO,ENAME,SAL,COMM,nvl2(comm, sal+comm, sal) FROM EMP;
EMPNO ENAME SAL COMM NVL2(COMM,SAL+COMM,SAL)
7369 SMITH 800.00 800
7499 ALLEN 1600.00 300.00 1900
7521 WARD 1250.00 500.00 1750
7566 JONES 2975.00 2975
7654 MARTIN 1250.00 1400.00 2650
7698 BLAKE 2850.00 2850
7782 CLARK 2450.00 2450
7788 SCOTT 3000.00 3000
7839 KING 5000.00 5000
7844 TURNER 1500.00 0.00 1500
7876 ADAMS 1100.00 1100
7900 JAMES
7902 FORD 3000.00 3000
7934 MILLER 1300.00 1300

SELECT EMPNO,ENAME,SAL,COMM,COALESCE(SAL+COMM,SAL,COMM,0) FROM EMP;
EMPNO ENAME SAL COMM COALESCE(SAL+COMM,SAL,COMM,0)
7369 SMITH 800.00 800
7499 ALLEN 1600.00 300.00 1900
7521 WARD 1250.00 500.00 1750
7566 JONES 2975.00 2975
7654 MARTIN 1250.00 1400.00 2650
7698 BLAKE 2850.00 2850
7782 CLARK 2450.00 2450
7788 SCOTT 3000.00 3000
7839 KING 5000.00 5000
7844 TURNER 1500.00 0.00 1500
7876 ADAMS 1100.00 1100
7900 JAMES 0
7902 FORD 3000.00 3000
7934 MILLER 1300.00 1300
其中,coalesce函数的逻辑是计算员工的总收入——依次计算其工资与补助之和、工资、补助、和常量表达式0,得到第一个非空的值后即停止并返回该值。

decode()

decode函数用于实现多路分支结构,其语法格式如下:
decode(col|expression, search1, result1 [, search2, result2,...,] [, default])
其逻辑是,首先计算第一个表达式(col|expression)的值;再依次与各搜索字表达式(search1, search2,...)相比较,如果匹配则返回相应的结果(result1, result2,..);如果均不匹配,返回表达式default的值;如果未指定default表达式,则返回空值。例如:
SELECT empno, ename, sal, decode(deptno, 10, '财务部',
20, '研发部',
30, '销售部',
'未知部门') AS 部门
FROM emp;
上述SELECT语句中,使用decode函数将各部门编号转换为相应的部门名称,其中的换行是为了增强代码的可读性,而不是必须的。" AS 部门"成分用于指定表达式别名,也不是必须的。
EMPNO ENAME SAL DEPARTMENT
7369 SMITH 800.00 RD_DEPARTMENT
7499 ALLEN 1600.00 SALS_DEPARTMENT
7521 WARD 1250.00 SALS_DEPARTMENT
7566 JONES 2975.00 RD_DEPARTMENT
7654 MARTIN 1250.00 SALS_DEPARTMENT
7698 BLAKE 2850.00 SALS_DEPARTMENT
7782 CLARK 2450.00 FINANCIAL_DEPARTMENT
7788 SCOTT 3000.00 RD_DEPARTMENT
7839 KING 5000.00 FINANCIAL_DEPARTMENT
7844 TURNER 1500.00 SALS_DEPARTMENT
7876 ADAMS 1100.00 RD_DEPARTMENT
7900 JAMES SALS_DEPARTMENT
7902 FORD 3000.00 RD_DEPARTMENT
7934 MILLER 1300.00 FINANCIAL_DEPARTMENT

case表达式 和decode函数的功能类似,case表达式也用于实现多路分支结构,其语法格式如下:
CASE exp WHEN comparison_exp1 THEN return_exp1
[ WHEN comparison_exp2 THEN return_exp2
WHEN comparison_expn THEN return_expn
ELSE else_exp ]
END
其逻辑是,首先计算第一个表达式exp的值;再依次与关键字WHEN后的各搜索字表达式的值进行比较,如匹配则返回相应的结果(THEN后的结果表达式的值),如果均不匹配,返回ELSE表达式else_exp的值;如果未指定ELSE表达式,则返回空值。例如:
SELECT empno, ename, sal,
CASE deptno WHEN 10 THEN '财务部'
WHEN 20 THEN '研发部'
WHEN 30 THEN '销售部'
ELSE '未知部门'
END 部门名称
FROM emp;
EMPNO ENAME SAL DEPARTMENT_NAME
7369 SMITH 800.00 RE_DEPARTMENT
7499 ALLEN 1600.00 SALS_DEPARTMENT
7521 WARD 1250.00 SALS_DEPARTMENT
7566 JONES 2975.00 RE_DEPARTMENT
7654 MARTIN 1250.00 SALS_DEPARTMENT
7698 BLAKE 2850.00 SALS_DEPARTMENT
7782 CLARK 2450.00 FINANCIAL_DEPARTMENT
7788 SCOTT 3000.00 RE_DEPARTMENT

函数嵌套
Oracle单行函数可以嵌套使用,其嵌套层次无限制。嵌套函数的执行顺序是由内到外,实际上是将内层函数的计算结果/返回值做为参数调用的外层函数,例如:

SELECT empno, lpad(initcap(trim(ename)),10,' ') name, job, sal FROM emp;
上述语言语句中,首先使用trim函数对员工姓名的开头及结尾可能存在的空格符进行过滤,然后使用initcap函数对过滤结果字符串进行拼写转换(首字母改为大写、其余字母小写),最后再使用lpad函数对其进行扩充(左侧填充空格符符、长度扩充至10位),这种逻辑在数据的格式化显示处理中比较常见。

SQL通用函数-nvl-nvl2 -nvlif-nullif-coalesce-decode-case的更多相关文章

  1. oracle通用函数,nvl,nvl2,NULLIF ,coalesce

    Oracle 通用函数 ① NVL 函数--------将空值转换成一个已知的值: 可以使用的数据类型有日期.字符.数字. 函数的一般形式:   NVL(commission_pct,0)       ...

  2. NVL NVL2 NVLIF

    ========Oracle=======NVL (expr1, expr2)->expr1为NULL,返回expr2:不为NULL,返回expr1.注意两者的类型要一致

  3. oracle几个函数整理 DECODE() NVL NVL2 NULLIF Coalesce(转)

    DECODE() decode()函数简介: 主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明): 使用方法: Select decode(columnname,值1,翻译值1,值 ...

  4. oracle NVL,NVL2,NULLIF,COALESCE

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  5. PLSQL_基础系列06_判断操作NVL / NULLIF / COALESCE / NVL2(案例)

    2014-12-08 Created By BaoXinjian

  6. oracle group by rollup,decode,grouping,nvl,nvl2,nullif,grouping_id,group_id,grouping sets,RATIO_TO

    干oracle 047文章12当问题,经验group by 声明.因此邂逅group by  rollup,decode,grouping,nvl,nvl2,nullif,RATIO_TO_REPOR ...

  7. NVL函数(NVL,NVL2,NULLIF,COALESCE)

    NVL 语法:NVL( expr1, expr2) 功能:如果expr1为NULL,则NVL函数返回expr2的值,否则返回expr1的值,如果两个参数的都为NULL ,则返回NULL. 注意事项:e ...

  8. 函数nvl,nvl2,nullif,coalesce

    NVL: Converts a null value to an actual valueNVL2:If expr1 is not null, NVL2 returns expr2. If expr1 ...

  9. oracle函数nvl,nvl2的区别,nullif函数,coalesce函数

    在oracle中用nvl和nvl2函数来解决为空的情况,例如,如果奖金为空,则为它指定一个数.也就是nvl(奖金字段,指定的奖金),但是两个的类型要一致. 1)nvl()函数 SQL> sele ...

  10. oracle之nvl,nvl2,decode

    oracle sql常用查询nvl,nvl2,decode区别及使用方法 1,NVL( E1, E2) 如果E1为NULL,则NVL函数返回E2的值,否则返回E1的值,如果两个参数都为NULL ,则返 ...

随机推荐

  1. Javascript 常用函数【3】

    jquery选中radio //如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_category").each(function() { if ($(t ...

  2. Javascript 常用函数【1】

    1:基础知识 1 创建脚本块 1: <script language=”JavaScript”> 2: JavaScript code goes here 3: </script&g ...

  3. VS专案项目无法生成pdb文件解决办法

    在系统盘里找到该项目对应的dll文件(我的是在C:\Windows\Microsoft.NET\assembly\GAC_MSIL目录下),删除该dll后重新生成项目即可.

  4. 单点登录CAS使用记(八):使用maven的overlay实现无侵入的改造CAS

    前期在学习CAS部署的过程中,都是网上各种教程,各种方案不停的尝试. 期间各种侵入改源码,时间久了,改了哪个文件,改了哪段配置,增加了哪段代码,都有可能混淆不清了. 而且最大的问题是,万一换个人来维护 ...

  5. jq实现鼠标经过图片翻滚效果

    短短的十多行代码就实现了一个酷炫的图片翻滚代码,要实现这个效果并不难,只要思路对了,一切都好办,不多说了,直接上代码看效果! html结构: <ul class="list" ...

  6. MOOTOOLS和JQUERY如何同时存在,解决冲突

    mootools-jquery 今天在做EcStore前台的做效果时,由于Jquery的插件比较多,于是就使用了Jquery的插件,但是发现会引起Mootools的冲突. 于是猛找资料,终于找到了,现 ...

  7. 在线支付接口之PHP支付宝接口开发简单介绍

    php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...

  8. 猜数字-js

    var n = Math.round(Math.random()*10); //随机数 // alert(n); while(true){ var Onum = prompt('请输入1-10之间的数 ...

  9. 如何访问google

    http://www.williamlong.info/archives/3983.html http://jingyan.baidu.com/article/29697b91316f2fab20de ...

  10. Asp.net Core 缓存 MemoryCache 和 Redis

    Asp.net Core 缓存 MemoryCache 和 Redis 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitH ...