如何简化含多NULL判断条件的DECODE函数?
简化Oracle DECODE函数的方案
原函数的意图是对三个输入变量修剪空格后,判断是否存在任意一个变量为NULL,存在则返回'Y',否则返回'N',但原DECODE的写法存在逻辑错误:DECODE中NULL与任何值(包括NULL)的比较都不会匹配,所以原SELECT语句永远返回'N',无法实现预期功能。
以下是几种简化且正确的实现方式:
方案一:使用CASE表达式(最直观易读)
直接通过PL/SQL的条件判断返回结果,无需查询DUAL表:
CREATE FUNCTION FNC_001 (VAR_1 IN OUT VARCHAR, VAR_2 IN OUT VARCHAR, VAR_3 IN OUT VARCHAR) RETURN VARCHAR IS BEGIN VAR_1 := TRIM(VAR_1); VAR_2 := TRIM(VAR_2); VAR_3 := TRIM(VAR_3); RETURN CASE WHEN VAR_1 IS NULL OR VAR_2 IS NULL OR VAR_3 IS NULL THEN 'Y' ELSE 'N' END; END;
方案二:使用COALESCE函数(更简洁)
利用COALESCE返回第一个非NULL值的特性,判断三个变量是否全为非NULL:
CREATE FUNCTION FNC_001 (VAR_1 IN OUT VARCHAR, VAR_2 IN OUT VARCHAR, VAR_3 IN OUT VARCHAR) RETURN VARCHAR IS BEGIN VAR_1 := TRIM(VAR_1); VAR_2 := TRIM(VAR_2); VAR_3 := TRIM(VAR_3); RETURN CASE WHEN COALESCE(VAR_1, VAR_2, VAR_3) IS NULL THEN 'Y' ELSE 'N' END; END;
方案三:修正原DECODE的写法(若坚持使用DECODE)
由于DECODE不支持直接匹配NULL,需要通过CASE转换为可匹配的值:
CREATE FUNCTION FNC_001 (VAR_1 IN OUT VARCHAR, VAR_2 IN OUT VARCHAR, VAR_3 IN OUT VARCHAR) RETURN VARCHAR IS BEGIN VAR_1 := TRIM(VAR_1); VAR_2 := TRIM(VAR_2); VAR_3 := TRIM(VAR_3); RETURN DECODE(1, CASE WHEN VAR_1 IS NULL THEN 1 END, 'Y', CASE WHEN VAR_2 IS NULL THEN 1 END, 'Y', CASE WHEN VAR_3 IS NULL THEN 1 END, 'Y', 'N' ); END;
内容的提问来源于stack exchange,提问作者Felipe Vidal
相关产品推荐
相关产品推荐

