SQL Server减法运算返回NULL,使用ISNULL/COALESCE仍无效如何解决
问题根因与解决方案
1 核心逻辑错误:IN子句误用加法运算符
你代码中两个子查询的IN条件里使用了+连接数值,这是算术求和逻辑,会把所有数值相加得到一个单一数字,完全不符合你要匹配多个EVEN_COD_X值的需求。这会直接导致子查询几乎匹配不到任何行,SUM(VLR_X)默认返回NULL,无论外层怎么套ISNULL/COALESCE都不会生效。
修正方式:把IN条件里的所有+替换为逗号,。
2 SUM函数无匹配行时默认返回NULL
就算IN逻辑修正后,如果对应筛选条件下没有符合的行,SUM()的返回值依然是NULL,而NULL参与任何算术运算的结果都是NULL。如果你之前只把非空判断套在整个减法表达式外层,依然会得到NULL,必须给每个SUM的返回结果单独包裹非空处理,指定无数据时返回0。
3 类型不统一隐患
当前代码ELSE分支返回空字符串'',和THEN分支返回的INT类型会发生隐式转换,可能触发额外的转换异常,建议ELSE分支统一返回0。
修正后完整代码
CASE WHEN TIPO_X = 'F' AND TIPO_CALCULOX IN ('N','S','D') AND TRPR_COD_X IN (7,13,15,17) AND EVEN_COD_X IN (623,70623,947,70947,1871,71871,2697,72697,2871,72871,30623,30947,31871,22697,22871,20623,20947,21871) THEN CONVERT(int, ISNULL(( SELECT SUM(VLR_X) FROM GMS_RELATORIO_GERAL WHERE CHAPA_X = MATRÍCULA_DO_SEGURADO AND EVEN_COD_X IN (623,70623,947,70947,1871,71871,2697,72697,2871,72871,30623,30947,31871) AND MONTH(DT_COMP_X) = @MES ), 0)) - CONVERT(int, ISNULL(( SELECT SUM(VLR_X) FROM GMS_RELATORIO_GERAL WHERE CHAPA_X = MATRÍCULA_DO_SEGURADO AND EVEN_COD_X IN (22697,22871,20623,20947,21871) AND MONTH(DT_COMP_X) = @MES ), 0)) ELSE 0 END AS RENUMERAÇÃO_DA_CONTRIBUIÇÃO
内容的提问来源于stack exchange,提问作者Lucas Capatini
相关产品推荐
相关产品推荐

