#NULLIF
NULLIF函数用于对两个参数的值进行比较,相等时返回NULL,不相等时返回expr1的值。本函数常用于防止程序中因为出现除以零错误而抛出异常。
expr1和expr2均为YashanDB认可的通用表达式,且存在如下约束:
- expr1不能为NULL,否则函数返回错误。
- expr1和expr2均不能为LOB大对象型,否则函数返回错误。
- expr2可以为NULL,此时函数返回expr1的值。
本函数根据以下规则确定返回结果的数据类型:
- expr1和expr2均为数值型时,函数将会确定其中具有最高精度的数据类型,并将计算结果转为该类型返回。
- expr1和expr2均为字符型时,数据类型优先级如下:
- NVARCHAR > VARCHAR > NCHAR > CHAR
- 函数返回值类型为expr中优先级最高的类型,且返回值长度为expr中的最大长度。
- expr1和expr2中有一个是DATE类型,另一个是TIMESTAMP类型时,函数返回TIMESTAMP类型。
- 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
----- ----- --------- -----------
2001 01 11001 16.6666667
2021 10 11001 15
2021 05 11001 15
2021 06 11001
2015 11 11001 15
2000 12 11001 15
2015 03 11001 15