一、NULL处理
(1)函数的计算过程
到目前为止,您已经学会了在简单语句中应用单行函数。不过,函数可以嵌套任意层。所以,了解嵌套函数的计算过程非常重要。下例就是一个嵌套函数。其计算过程是从最里层开始计算,直到最外层。
SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(聘用日期, 6),'FRIDAY'), 'fmDay, Month DDth, YYYY') AS "下一天计算结果"
FROM 雇员
WHERE 雇员标识=100;
结果为:
Friday, December 18th, 1987
SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(聘用日期, 6),'FRIDAY'), 'fmDay, Month DDth, YYYY') AS "下一天计算结果"FROM 雇员 WHERE 雇员标识=100;
• 步骤 1:在聘用日期基础上加上六个月。
• 步骤 2:确定聘用日期之后的第一个星期五。
• 步骤 3:转换默认的日期格式,采用如下格式显示这个星期五:Friday, December 18th, 1987,在输出结果中这些内容将显示在列名“下一天计算结果”下。
(2)涉及 Null 值的函数
在课程开始阶段,我们已介绍了“Null”这个术语。您可能还记得,Null 就是不可用、未指定、未知或不适用的值。从根本上讲,我们无法测试该值是否与其它值一样,因为我们不知道它是什么值。它不等于任何值,也不等于零!Null 不代表任何实际值,但这并不意味着它不重要。请想象一下这样的问题:X = Y 正确吗?要回答此问题,必须知道 X 和 Y 的值。Oracle 有四个涉及使用null 值的常规函数。这四个函数为:- NVL
- NVL2
- NULLIF
- COALESCE
二、NVL 函数
NVL 函数可以将 null 值转换为固定数据类型(日期、字符或数字)的已知值。Null 值列和新值的数据类型必须相同。
该 NVL 函数为:
NVL (可能包含 null 的值或列, 用以替换 null的值)
以下查询使用字符数据类型的 NVL 函数:select nvl(注释, '没有注释')
from d_播放列表曲目;
Null 值列和新值的数据类型必须相同,如下例
所示:
nvl(批准的费用金额,0)
nvl(聘用日期,'01-JAN-97')
nvl(专业,'暂无')
可以在进行计算之前,使用 NVL 函数将包含null 的列值转换为数字。对 null 执行算术计算时,结果为 null。NVL 函数可以在进行算术计算之前,将 null 值转换为数字,以避免结果为 null。
在本示例中,D_合作伙伴表中的“批准的费用金额”列包含 null 值。NVL 函数用于在进行算术计算之前将 null 更改为零。
select 名字, 姓氏, nvl(批准的费用金额, 0) * 1.05 as 费用
from d_合作伙伴;
三、NVL2 函数
NVL2 函数对包含三个值的表达式求值。如果第一个值不为 null,则 NVL2 函数返回第二个表达式。如果第一个值为 null,则返回第三个表达式。表达式 1 中的值可以采用任意数据类型。表达式 2 和表达式 3 可以采用 LONG 之外的任意数据类型。返回值的数据类型始终与表达式 2 的数据类型相同,除非表达式 2 是字符数据(在这种情况下,返回值为 VARCHAR2 数据类型)。NVL2 函数是:
NVL2 (可能包含 null 的表达式 1 值, 表达式 1 不是null 时要返回的表达式 2 值, 表达式 1 是 null 时用以替换 null 的表达式 3 值)
记忆 NVL2 函数的一个小窍门是:“如果表达式 1 具有值,则返回替代表达式 2;如果表达式 1 是 null,则返回替代表达式 3。”
在下面所示的 NVL2 函数中,表达式 1 使用数字数据,表达式 2和 3 使用字符数据。select 姓氏, 薪金, nvl2(佣金百分比, 薪金 + (薪金 * 佣金百分比), 薪金) as 收入
from 雇员;
四、NULLIF 函数
NULLIF 函数对两个函数进行比较。如果它们相等,则函数返回null。如果不相等,则函数返回第一个表达式。
NULLIF 函数为:
nullif(表达式 1, 表达式 2)
select 名字, length(名字) "名字长度",姓氏, length(姓氏) "姓氏长度", nullif(length(名字), length(姓氏)) as "比较结果"
from d_合作伙伴;
五、COALESCE 函数
COALESCE 函数是 NVL 函数的扩展,但是COALESCE 函数可以接受多个值。单词“coalesce”的字面意义是“联合”,这就是该函数所要执行的操作。如果第一个函数是 null,则函数会继续执行下一行,直到找到一个非 null 表达式。当然,如果第一个表达式具有值,则函数将返回第一个表达式并就此结束。
COALESCE 函数为:
COALESCE (表达式 1,表达式 2, ...表达式 n)
分析右侧所示的从雇员表进行检索的 SELECT 语句。
哪些雇员未获得佣金?您是如何判断出的?是否有些雇员既未获得佣金也未获得薪金?