通用函数适用于任何类型数据(包括空值),一般用于实现空值处理、条件运算和多路分支结果,下面介绍其中常用的几种:
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. 查看oracle数据库下面的所有的表,执行某个sql脚本:

    查看oracle数据库下面的所有的表: select * from user_tables;//user为用户名 执行某个sql脚本: SQL>@e 文件名.sql

  2. C/C++默认浮点型

    代码: #include <iostream> #include <cstdio> using namespace std; void test(int a){ cout< ...

  3. ASP.NET常用技术之加密解密

    在开发项目中有许多数据需要我们进行加密解密操作,这里介绍几个加密解密的方法. 一:MD5加密 MD5加密是一种单向的加密算法,它只能加密,加密后不能进行逆向解密操作,常用于数字签名和加密用户密码. 下 ...

  4. PHPの页面跳转-常见方法

    PHP页面跳转一.header()函数 header()函数是PHP中进行页面跳转的一种十分简单的方法.header()函数的主要功能是将HTTP协议标头(header)输出到浏览器. header( ...

  5. MySQL和MsSQL实时自动同步---SyncNavigator 数据库同步软件

    需要MySQL数据库支持的狐友们有福了,MySQL和MsSQL实时自动同步---SyncNavigator 数据库同步软件   使用SyncNavigator轻松实现数据库异地同步.断点续传.异构同步 ...

  6. idHTTP最简洁的修改和取得Cookie例子

    procedure TForm1.Button1Click(Sender: TObject); var HTTP: TidHTTP; html, s: string; i: integer; begi ...

  7. ServletContext对象的应用

    由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯.ServletContext对象通常也 ...

  8. web安全:xss && csrf

    首先在user.php文件中去除黑名单的第一行标签,在白名单中添加<script>E1:csrf攻击zoobarcsrf:cross-site request forgery    跨站伪 ...

  9. webuploader文件上传问题总结

    webuploader百度的一个很好的上传文件插件: 选择它的原因: 1.浏览器兼容性好,支持IE8,这是我最主要的,好多上传插件都不支持: 2.跨域访问,因为我的上传需要到图片服务器上,这就需要跨域 ...

  10. file_get_content、fsockopen和curl之间的优缺点

    file_get_content 优点:在抓取单个文件上,效率很高,返回没有头信息的文件. 缺点:在抓取远程文件时,和fopen一样容易出错.在抓取多个跨域文件时,未对DNS进行缓存,所以效率上不不高 ...