Impala 在 case when 语句中不兼容 return 类型

Impala incompatible return types in case when statement

我是 运行 一个 Impala 查询并尝试使用 case when 语句:

SELECT *,
CASE WHEN typ_prtctn  = 2 then  0.5*PRTCTN_ALLCTD_VL  -- life insurance policies pledged
WHEN typ_prtctn  = 18 then  2*PRTCTN_ALLCTD_VL  -- equity and investment funds shares
ELSE PRTCTN_ALLCTD_VL END as PROTECTION_VALUE
FROM database.tablename

抱怨

AnalysisException: Incompatible return types 'DECIMAL(38,9)' and 'DECIMAL(38,10)' of exprs '0.5 * PRTCTN_ALLCTD_VL' and 'PRTCTN_ALLCTD_VL'.

但是这很好用:

SELECT *,
0.5*PRTCTN_ALLCTD_VL as test  
FROM database.tablename

如错误消息所示,PRTCTN_ALLCTD_VL 的类型为 decimal(38,10)。任何建议表示赞赏

尝试将大小写强制转换为十进制

  SELECT *,
    CAST(CASE WHEN typ_prtctn  = 2 then  0.5*PRTCTN_ALLCTD_VL  -- life insurance policies pledged
            WHEN typ_prtctn  = 18 then  2*PRTCTN_ALLCTD_VL  -- equity and investment funds shares
        ELSE PRTCTN_ALLCTD_VL END as DECIMAL(10,4) ) AS  PROTECTION_VALUE

或尝试将相同的数据类型应用于所有强制浮点数的计算(1.0、2.0 而不是 2* 和相同的值)

CASE WHEN typ_prtctn  = 2 then  0.5*PRTCTN_ALLCTD_VL  -- life insurance policies pledged
WHEN typ_prtctn  = 18 then  2.0*PRTCTN_ALLCTD_VL  -- equity and investment funds shares
ELSE 1.0*PRTCTN_ALLCTD_VL END as PROTECTION_VALUE

这是一个奇怪的问题,一个我没有预料到的问题。 case 表达式 returns 单一类型,因此所有条件必须同时转换为 表达式中。

您可以通过显式类型转换解决此问题。我不确定类型应该是什么,所以我猜:

(CASE WHEN typ_prtctn  = 2 
      THEN CAST(0.5 * PRTCTN_ALLCTD_VL AS DECIMAL(38, 10)) -- life insurance policies pledged
      WHEN typ_prtctn  = 18 
      THEN CAST(2 * PRTCTN_ALLCTD_VL AS DECIMAL(38, 10))  -- equity and investment funds shares
      ELSE CAST(PRTCTN_ALLCTD_VL as DECIMAL(38, 10))
 END) as PROTECTION_VALUE

我怀疑这是因为 38 是最大精度。乘法可能会改变 precision/scale 并且因为该值已经具有最大精度,所以存在问题。我不希望这通常发生在小数上。