多CASE条件执行报invalid number错误,满足首条件仍需额外CASE?
问题原因解析
你的问题核心在于数据库SQL的表达式求值顺序:数据库会先计算CASE语句中所有分支的表达式,再根据条件判断返回哪个分支的结果,而非先判断条件再执行对应分支的表达式。
原SQL报错的具体原因
在你的原SQL中,即使第一个WHEN MAX(...) = 9999的条件成立(因为存在DRR='80+',对应的CASE返回9999,MAX结果就是9999),数据库依然会提前计算ELSE分支里的两个TO_NUMBER(substr(...))表达式:
- 当处理
DRR='80+'这条记录时,INSTR(d.DRR, '-')返回0(字符串里没有'-'),substr(d.DRR, INSTR(...) +1)会取整个字符串'80+',用TO_NUMBER转换这个包含非数字字符的字符串,直接触发invalid number错误。
添加额外CASE后正常运行的原因
你添加的额外CASE,在转换数字前先对特殊值('CURR'、'80+')做了判断,给这些情况返回合法的数字(0或1),避免了对非数字字符串执行TO_NUMBER转换,所以不会触发错误。
验证逻辑
拿你的数据集举例:
- 原SQL执行时,不管第一个WHEN是否满足,都会尝试对
'80+'执行TO_NUMBER(substr('80+', 0+1)),也就是TO_NUMBER('80+'),必然报错。 - 加了CASE判断后,处理
'80+'时会直接返回1,跳过TO_NUMBER(substr(...))的转换,自然不会报错。
内容的提问来源于stack exchange,提问作者Ali Khalil
相关产品推荐
相关产品推荐

