【问题标题】:PostgreSQL sum typecasting as a bigintPostgreSQL sum 类型转换为 bigint
【发布时间】:2025-11-29 19:05:02
【问题描述】:

我正在做一个整数列的 sum() 并且我想将结果类型转换为一个 bigint - 以避免错误。但是,当我尝试使用 sum(myvalue)::bigint 时,它仍然给我一个超出范围的错误。

我可以对查询做些什么来让它工作吗?还是我必须将列类型更改为 bigint?

【问题讨论】:

  • 试试 sum(myvalue::bigint)
  • sum(myvalue)::bigint 的意思是“计算聚合函数 sum 超过 myvalue,然后将其结果转换为 bigint” - 所以当转换发生时,sum() 已经选择了它的结果类型。
  • 从文档中,sum 返回bigint for smallint or int arguments, numeric for bigint arguments, double precision for floating-point arguments, otherwise the same as the argument data type,因此无论如何可能都不需要内部转换。实际上,整数总和溢出 bigint 所需的行数可能首先会在其他方面失败(如磁盘空间、IO 带宽等)。虽然我见过一些实际溢出的边缘案例。

标签: sql postgresql types aggregate-functions bigint


【解决方案1】:

结果显然比bigint 所能承受的要大:

-9223372036854775808 至 +9223372036854775807

Postgres 在这种情况下返回numeric。你不应该做任何事情,它应该在没有显式转换的情况下工作。

如果不是,您可以将基类型强制转换为bigint,从而在任何情况下都将结果强制为numeric

SELECT sum(myvalue::int8) ...

【讨论】:

  • 猜得好,但我应该指定这些值在 bigint 范围内。
  • @AaronKreider:一般来说,您应该提供表定义(您从 psql 中获得的内容带有\d mytable)并且更具体。 “价值观”仍然模棱两可……
【解决方案2】:

我使用以下语句解决了我的问题

SUM(CAST(gross_amount AS Integer))

这是将列的结果作为 SUm bigint,

注意:我的列 Gross_amount 是双精度类型。

【讨论】:

    【解决方案3】:

    您需要在进行操作之前对其进行投射

    SUM(myvalue::bigint)
    

    【讨论】:

      最近更新 更多