当参数类型为 int 时,PostgreSQL 总和类型转换为 bigint

PostgreSQL sum typecasting as a bigint when argument types are int

我知道 PostgreSQL sum typecasting as a bigint 前一段时间有人问过同样的问题,但我没有看到有人回答。我正在使用 sum 函数添加一个类型为整数的列的值,但是当我添加两个 15 亿时它会溢出。我希望总和结果是 bigint。无论如何要实现它?提前致谢。我尝试关注但没有成功。

sum(count)::bigint AS total

如果我按照下面的方式操作,我仍然会收到错误 总和(计数::bigint)作为总计

Caused by: org.postgresql.util.PSQLException: ERROR: cannot change data type of column "total" from integer to numeric

你应该在 之前投 来求和。即:

sum(count::bigint) as total

在 postgres 中,sum(integer) 和 sum(bigint) 是不同的函数,returns 分别是 integer 和 big integer。

事实上,所有 postgres 函数不仅通过其名称而且通过其名称和参数类型的组合来标识。

如果您之前没有转换,那么您最终会使用 sum() 的整数版本,它总是 return 整数。即使您 稍后 将其转换为 bigint。如果结果是溢出,则不能将溢出转换为 bigint。

编辑: 正如 abelisto 正确指出的那样,sum() 还 returns bigint 用于 smallint 和整数。但是,正如我所见,您的错误消息显示 "cannot change type of column total from integer to numeric"。但据我了解,"total"是整个运算的结果,所以应该是bigint(即使溢出)。

...不确定它是否试图指向(操作后)标记为 "total" 的 "count" 列(但它让我感到困惑...)或者它是否只是说它不能将 numeric 转换为 bigint(这对我来说似乎更可行)。这取决于 count 列的实际类型。它已经是 bigint 或 numeric 了吗?

如果是,问题可能在于试图将一个非常大的数字(numeric 类型)值转换为 bigint。

你能告诉我们 "count" 列的确切类型吗?更好的是:你能提供一个带有文字值的失败示例吗?

类似的东西(但我只收到 "bigint out of range" 错误...):

somedb=> with foo as (
    select 1000000000 as a
    union select 231234241234123
    union select 99999999999999999999999
) select sum(a) from foo;
           sum            
--------------------------
 100000000231235241234122
(1 row)

somedb=> with foo as (
    select 1000000000 as a
    union select 231234241234123
    union select 99999999999999999999999
) select sum(a)::bigint from foo;
ERROR:  bigint out of range