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

    Core Data是苹果针对Mac和iOS平台开发的一个框架, 通过CoreData可以在本地生成数据库sqlite,提供了ORM的功能,将对象和数据模型相互转换 . 通过Core Data管理和操作 ...

  2. The account '' has no team with ID ''

    Xcode 升级到7.2 版本,真机测试的时候报错:The account '' has no team with ID '' 解决办法1:http://stackoverflow.com/quest ...

  3. Fiddler 网页采集抓包利器

    最近这段时间,网页采集方面的工作做得比较多.用curl技术开发了一个微信文章聚合类产品,把抓取到的数据转换成json格式,并在android端调用json数据接口加以显示:基于weiphp做了一个掌上 ...

  4. 使用shiro标签遇到的部分问题的解决思路

    最近几天,在shiro进行系统权限控制.在处理JSP页面的时候,遇到几个问题,纠结好几天,终于成功解决这些问题. 1.使用<shiro:principal>的时候,如何得到整个类的信息? ...

  5. UVA 305 Joseph (约瑟夫环 打表)

     Joseph  The Joseph's problem is notoriously known. For those who are not familiar with the original ...

  6. Oracle数据库简介

    Oracle数据库简介 一.介绍 Oracle数据库系统是美国Oracle(甲骨文)公司提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(Client/Server,C/S)或浏览 ...

  7. Android Init进程命令的执行和服务的启动

    这里开始分析init进程中配置文件的解析,在配置文件中的命令的执行和服务的启动. 首先init是一个可执行文件,它的对应的Makfile是init/Android.mk. Android.mk定义了i ...

  8. Java编程之字符集问题研究

    1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是" ...

  9. C语言杂记 -- 简陋的<深入理解计算机系统>笔记

    程序的表示 l 32位64位操作系统是由CPU寄存器的位数决定,即虚拟寻址的范围为2^32.2^64. l 字节的大端小端法是以字节为基本单位的:比如十进制的7在十六位机器上表示 · 地址 100 1 ...

  10. 递归目录的shell脚本

    #! /bin/sh # 在其他目录运行时一定要加上这样的语句 # 尤其是配置在crontab里自动运行 cd `` #定义数据别名 alias statdb="/usr/local/mys ...