功能
比较 expr1 和 expr2 的值,若二者相等,则返回 NULL,否则返回 expr1 的值。其中 expr1 不能为 NULL。
NULLIF 函数在逻辑上相当于下面的 CASE 语句:
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
举例
SQL> select nullif('yct','tyc') from dual;
NUL
---
yct
SQL> select nullif('yct','yct') from dual;
NUL
---
expr1 和 expr2 的类型必须一致,否则会提示错误,因为无法比较二者是否相等:
SQL> select nullif('yct',sysdate) from dual;
select nullif('yct',sysdate) from dual
*
ERROR 位于第 1 行:
ORA-00932: 不一致的数据类型: 要求 CHAR 得到的却是 DATE
当 expr1 为 NULL 时,该函数提示错误:
SQL> select nullif(null,'adf') from dual;
select nullif(null,'adf') from dual
*
ERROR 位于第 1 行:
ORA-00932: 不一致的数据类型: 要求 - 得到的却是 CHAR
这里没有明确提示 expr1 不能为 NULL,而是说类型不一致。那么换成一致的类型呢:
SQL> select nullif(null,null) from dual;
select nullif(null,null) from dual
*
ERROR 位于第 1 行:
ORA-00932: 不一致的数据类型: 要求 - 得到的却是 CHAR
仍然会有这样的提示,不太明确。总之,expr1 是不能为 NULL 的。
下面的这个例子中,将查询哪个员工换了工作。表 job_history 中存储员工的历史工作记录,表 employees 中存储员工当前的工作记录:
SELECT e.last_name, NULLIF(e.job_id, j.job_id) "Old Job ID"
FROM employees e, job_history j
WHERE e.employee_id = j.employee_id
ORDER BY last_name;
LAST_NAME Old Job ID
------------------------- ----------
De Haan AD_VP
Hartstein MK_MAN
Kaufling ST_MAN
Kochhar AD_VP
Kochhar AD_VP
Raphaely PU_MAN
Taylor SA_REP
Taylor
Whalen AD_ASST
Whalen