#NULLIF
NULLIF函数用于比较expr1和expr2的值,相等时返回NULL,不相等时返回expr1的值。
本函数遵循如下规则:
expr1和expr2均不能为LOB类型和XMLTYPE类型。
CHAR、VARCHAR与NCHAR、NVARCHAR不可以混合运算,否则函数返回错误。
若expr1和expr2的数据类型不同且无法按照一定的规则进行转换,函数将返回类型转换错误。
当expr1为NULL时,函数返回为NULL。
当expr2为NULL时,函数返回expr1的值。
函数返回值类型规则如下:
expr1和expr2均为数值型时,函数将会确定其中具有最高精度的数据类型,并将计算结果转为该类型返回。
expr1和expr2均为字符型时,函数返回值类型为expr1的类型。
expr1、expr2其中之一为DATE类型,另一个为TIMESTAMP类型时,函数返回TIMESTAMP类型。
expr1、expr2其中之一为数值类型,另一个为数值的字符串类型时,函数返回数值类型。
除上述场景外,当expr1与expr2的类型相同时函数返回此数据类型的值。
示例
--expr1和expr2的值不相等时
SELECT NULLIF('123','456') res FROM DUAL;
RES
-----
123
--expr1和expr2的值相等时
SELECT NULLIF('123','123') res FROM DUAL;
RES
-----
--sales_info表包含了机构的11001产品的销售数量和金额信息,现对其增加一条数量和金额均为0的记录
INSERT INTO sales_info VALUES ('2021','06','0101','11001',0,0,'');
--当需要计算11001产品的在每个月的销售单价时,会出现除以0错误
SELECT year,month,product,amount/quantity
FROM sales_info
WHERE product='11001';
[1:33]YAS-00011 divided by zero
--使用NULLIF函数提前预防此类错误,减少异常捕获处理,避免应用在此中断
SELECT year,month,product,amount/NULLIF(quantity,0) price
FROM sales_info
WHERE product='11001';
YEAR MONTH PRODUCT PRICE
----- ----- --------- -----------
2021 10 11001 15
2001 01 11001 16.6666667
2000 12 11001 15
2015 03 11001 15
2021 05 11001 15
2021 06 11001
2015 11 11001 15
Copied!