通用函数适用于任何类型数据(包括空值),一般用于实现空值处理、条件运算和多路分支结果,下面介绍其中常用的几种:
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. Code First研究学习1_Reverse Enginner Code First

    最近因为公司需要,自己开始研究Code First,之前还是听说过这个,也知道是代码优先的意思!至于具体怎么的代码优先,我的理解如下! 在听说code  first的时候,心里也就觉得怪了,是怎么将M ...

  2. Nagios设置只监控不报警

    设置全部监控项都开启邮件报警: vim /usr/local/nagios/etc/nagios.cfg 设置 enable_notifications=1    1为开启,0为关闭     如个别监 ...

  3. iOS 网络与多线程--1.检测网络链接状态

    通过Reachability库,检测设备的网络连接状况. 使用到的类库:Reachability Reachability库,是一个iOS环境下,检测设备网络状态的库,可以在网络上搜索下载. 使用之前 ...

  4. oracle 分布式数据库

    分布式数据库的数据库链路是单向的

  5. 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作

    4.4  从语句到程序 了解了各种表达式和语句之后,就相当于掌握了写作文要用到的词语和句子,但是,仅有词语和句子是无法构成一篇有意义的文章的.要完成一篇文章,先需要确定这篇文章的结构,是先分述再总述, ...

  6. jsp连接MySQL操作GIS地图数据,实现添加point的功能

    index_map.jsp中的代码: <%@ page language="java" pageEncoding="utf-8"%> <%@ ...

  7. ie6,7下js动态加载图片不显示错误

    ie6,7下js动态加载图片不显示错误 先描述一下出现这种匪夷所思bug的背景: 我在页面加载的时候加载一堆小缩略图,<a href="javascript:void(0);" ...

  8. Razor视图引擎

    在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. (1)Razor文件类型: ...

  9. python 的内置函数(1)

     19.内置函数:              abs():求绝对值              bool():求一个值是True or False ,其中False值有 0 ,空字符串'',None,空 ...

  10. win7禁止自动使用浏览器打开FTP而是用资源管理器

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\ftp] @="URL:File Transfer Protocol" ...