Presto SQL中sum()函数传入varchar参数报错的原因及解决咨询
嘿,这个问题其实很好解释!你碰到的报错核心原因很明确:Presto的SUM()函数不支持直接对字符串(varchar)类型的字段执行求和操作。
先看你收到的报错信息:
PrestoUserError: PrestoUserError(type=USER_ERROR, name=SYNTAX_ERROR, message="line 3:1: Unexpected parameters (varchar) for function sum. Expected: sum(double) , sum(real) , sum(bigint) , sum(interval day to second) , sum(interval year to month) , sum(decimal(p,s)) ")
这里已经把SUM()支持的参数类型列得清清楚楚了——只有数值型、日期间隔型或者DECIMAL类型才能被SUM()处理,而你的ae.amount是string类型,完全不在这个支持列表里,直接调用自然会触发语法错误。
你自己找到的解决方案其实就是正确的路子:先把字符串类型的金额字段转换为数值类型,再执行求和。比如你写的这个查询:
SELECT SUM(CAST(ae.amount as DECIMAL(13,2))) filter (where ae.type IN ('USA')) FROM db_1.table1
这里用CAST()把ae.amount转成DECIMAL(13,2)是非常合理的选择——DECIMAL类型能精准处理金额类的小数,13位的精度和2位小数也能覆盖绝大多数业务场景的数值范围,你可以根据自己的数据实际情况调整精度和小数位数。
额外给你提个小建议:如果ae.amount字段里存在非数字的内容(比如偶然混入的字母、符号),直接用CAST()会导致整个查询失败。这时候可以换成TRY_CAST(),它会把转换失败的行返回NULL,而NULL在SUM()计算时会被自动忽略,不会中断整个查询,让SQL更健壮:
SELECT SUM(TRY_CAST(ae.amount as DECIMAL(13,2))) filter (where ae.type IN ('USA')) FROM db_1.table1
内容的提问来源于stack exchange,提问作者Alex

