Impala SQL中用COALESCE替换NULL为1仍有NULL,求正确写法
问题根源
你的SQL存在两个导致NULL残留的问题:
CASE语句未定义ELSE分支,当不满足a.level = '8' AND a.assembly_flag = 'X'条件时,会默认返回NULL- 外层的
COALESCE仅传入了CASE的结果,未设置兜底默认值,无法处理CASE返回的NULL
修正方案
根据你后续要执行求和还是相乘的需求,分别提供对应写法:
场景1:替换NULL为1后求和
如果要统计满足条件的inclusion_kg(NULL转1)的总和,给CASE添加ELSE 0(不满足条件的行不计入求和):
SUM( CASE WHEN a.level = '8' AND a.assembly_flag = 'X' THEN COALESCE(a.inclusion_kg, 1) ELSE 0 END ) level_8_inclusion
场景2:替换NULL为1后相乘
如果要将处理后的字段相乘,使用Impala的PRODUCT聚合函数,同时ELSE设为1(乘1不会改变乘积结果,避免NULL导致整个乘积失效):
PRODUCT( CASE WHEN a.level = '8' AND a.assembly_flag = 'X' THEN COALESCE(a.inclusion_kg, 1) ELSE 1 END ) level_8_inclusion_product
核心提示
COALESCE(a.inclusion_kg, 1)仅处理满足条件行中inclusion_kg为NULL的情况- 必须给
CASE添加ELSE分支,明确不满足条件时的返回值,彻底消除NULL - 求和用0、相乘用1,是因为这两个值不会影响对应聚合运算的结果,你也可根据业务逻辑调整默认值
内容的提问来源于stack exchange,提问作者Asim Khan
相关产品推荐
相关产品推荐

