在app.preset.io执行PostgreSQL精度召回查询时遇类型转换错误求助
问题排查与解决方案
错误原因分析
你遇到的类型转换错误,本质是app.preset.io底层查询引擎(大概率是Trino/Presto,而非原生PostgreSQL)对ROUND函数的类型签名要求更严格。原生PostgreSQL会自动隐式转换兼容类型,但Trino要求ROUND的输入类型必须完全匹配其支持的签名集合(如Exact([Float64])、Exact([Decimal])等),而你的查询中存在Float32(real)和Int64(整数0)的混合类型,导致类型转换失败。
修正后的查询语句
将所有数值类型统一转换为numeric(Decimal),同时确保CASE分支中返回的默认值0也显式转换为同类型,消除类型不匹配:
WITH time_periods AS ( SELECT year, week, cast(tp as numeric) as tp, cast(fp as numeric) as fp, cast(tn as numeric) as tn, cast(fn as numeric) as fn FROM metrics_table WHERE week >= 37 ) SELECT year, week, CASE WHEN (tp + fp) = 0 THEN 0::numeric ELSE ROUND(tp / (tp + fp), 3) END as precision, CASE WHEN (tp + fn) = 0 THEN 0::numeric ELSE ROUND(tp / (tp + fn), 3) END as recall FROM time_periods ORDER BY year, week
关键调整点
- 把CTE中的
real转换改为numeric,避免Float32类型带来的兼容性问题 - CASE语句的
THEN 0改为0::numeric,确保默认值与计算结果的类型完全一致 - 移除了冗余的重复类型转换(CTE已经转成numeric,SELECT里无需再重复cast)
内容的提问来源于stack exchange,提问作者new world
相关产品推荐
相关产品推荐

