SQL通用函数-nvl-nvl2 -nvlif-nullif-coalesce-decode-case
通用函数适用于任何类型数据(包括空值),一般用于实现空值处理、条件运算和多路分支结果,下面介绍其中常用的几种:
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的更多相关文章
- oracle通用函数,nvl,nvl2,NULLIF ,coalesce
Oracle 通用函数 ① NVL 函数--------将空值转换成一个已知的值: 可以使用的数据类型有日期.字符.数字. 函数的一般形式: NVL(commission_pct,0) ...
- NVL NVL2 NVLIF
========Oracle=======NVL (expr1, expr2)->expr1为NULL,返回expr2:不为NULL,返回expr1.注意两者的类型要一致
- oracle几个函数整理 DECODE() NVL NVL2 NULLIF Coalesce(转)
DECODE() decode()函数简介: 主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明): 使用方法: Select decode(columnname,值1,翻译值1,值 ...
- oracle NVL,NVL2,NULLIF,COALESCE
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
- PLSQL_基础系列06_判断操作NVL / NULLIF / COALESCE / NVL2(案例)
2014-12-08 Created By BaoXinjian
- 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 ...
- NVL函数(NVL,NVL2,NULLIF,COALESCE)
NVL 语法:NVL( expr1, expr2) 功能:如果expr1为NULL,则NVL函数返回expr2的值,否则返回expr1的值,如果两个参数的都为NULL ,则返回NULL. 注意事项:e ...
- 函数nvl,nvl2,nullif,coalesce
NVL: Converts a null value to an actual valueNVL2:If expr1 is not null, NVL2 returns expr2. If expr1 ...
- oracle函数nvl,nvl2的区别,nullif函数,coalesce函数
在oracle中用nvl和nvl2函数来解决为空的情况,例如,如果奖金为空,则为它指定一个数.也就是nvl(奖金字段,指定的奖金),但是两个的类型要一致. 1)nvl()函数 SQL> sele ...
- oracle之nvl,nvl2,decode
oracle sql常用查询nvl,nvl2,decode区别及使用方法 1,NVL( E1, E2) 如果E1为NULL,则NVL函数返回E2的值,否则返回E1的值,如果两个参数都为NULL ,则返 ...
随机推荐
- PHP 异常处理
PHP 异常处理 异常用于在指定的错误发生时改变脚本的正常流程. 异常是什么 PHP 5 提供了一种新的面向对象的错误处理方法. 异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况 ...
- JSP中取COOKIE中指定值得方法【转载】
Cookie cookies[]=request.getCookies(); //读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组里面 Cookie sCookie=n ...
- phpCMS V9 自定义添加 全局变量{SKIN_PATH}方法
前言:目前v9版本新增{js_path},{css_path},{img_path}三个全局变量,代替2008版本中{skin_path},样式图片脚本分开路径,确实达到了一定在后台管理方便的目的,但 ...
- PHPCMS V9 简单的二次开发
更多二次开发技巧,查看phpcms系统帮助 ,前台模板解析后的缓存 caches\caches_template\default 前台控制类index.php,前台标签类*_tag.class.php ...
- 4种CSS3效果(360度旋转、旋转放大、放大、移动)
旋转: * { transition:All .4s ease-in-out; -webkit-transition:All .4s ease-in-out; -moz-transition:All ...
- Swift—扩展声明-备
声明扩展的语法格式如下: extension 类型名 { //添加新功能 } 声明扩展的关键字是extension,“类型名”是Swift中已有的类型,包括类.结构体和枚举,但是我们仍然可以扩展整型. ...
- Unix和Linux下C语言学习指南
转自:http://www.linuxdiyf.com/viewarticle.php?id=174074 Unix和Linux下C语言学习指南 引言 尽管 C 语言问世已近 30 年,但它的魅力仍未 ...
- Spark 启动过程(standalone)
Spark启动过程 正常启动Spark集群时往往使用start-all.sh ,此脚本中通过调用start-master.sh和start-slaves.sh启动mater及workers节点. 1. ...
- [LeetCode 112 113] - 路径和I & II (Path Sum I & II)
问题 给出一棵二叉树及一个和值,检查该树是否存在一条根到叶子的路径,该路径经过的所有节点值的和等于给出的和值. 例如, 给出以下二叉树及和值22: 5 / \ 4 8 ...
- TextView属性详解
android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all)android:a ...