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 并且因为该值已经具有最大精度,所以存在问题。我不希望这通常发生在小数上。
我是 运行 一个 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 并且因为该值已经具有最大精度,所以存在问题。我不希望这通常发生在小数上。