#NULLIF

nullif
NULLIF ( expr1 , expr2 )

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
pdf-btn 下载文档
copy-btn 复制链接