Oracle 12c CASE表达式列运算返回NULL问题排查与解决
解决Oracle 12c中CASE语句返回NULL的问题
我最近在开发一款基于Oracle 12c的Web应用时,碰到了一个棘手的问题:我写的CASE语句能正常运行,但总是返回NULL值。当时的语句是这样的:
CASE MRI.REVIEW_NAME WHEN 'wk1' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 7 WHEN 'wk2' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 14 WHEN 'wk3' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 21 WHEN 'wk4' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 28 WHEN 'wk5' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 35 WHEN 'wk6' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 42 WHEN 'wk7' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 49 WHEN 'wk8' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 56 WHEN 'wk9' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 63 WHEN 'wk10' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 70 WHEN 'wk11' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 77 WHEN 'wk12' THEN COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE) + 84 END AS REVIEW_END_DATE,
当时我特别疑惑:Oracle的CASE语句允许在THEN子句里使用列运算吗?因为我之前看到的示例大多都是返回字符串值,不确定这种日期加减的操作是否合法。而且项目要求只能用纯SQL解决,不能用PL/SQL,这也让我一开始没考虑其他方案。
后来经过仔细排查,发现问题根本不在CASE语句的语法上——Oracle 12c完全支持在CASE的THEN分支中进行列运算(包括日期计算),导致返回NULL的原因是我的数据本身有问题:要么是MRI.REVIEW_NAME的值不在'wk1'到'wk12'的范围内,要么是COALESCE(A.DC_CLASSIFICATION_DATE,A.DC_TRANSFER_DATE)返回了NULL,导致整个表达式结果为NULL。
修正数据之后,这条CASE语句就正常运行了,也验证了这种用法的可行性。
内容的提问来源于stack exchange,提问作者Jeepers Creepers
相关产品推荐
相关产品推荐

