我知道有人在前一段时间PostgreSQL sum typecasting as a bigint提出了同样的问题,但我认为没有人回答。我使用sum函数添加类型为整数的列的值,但是当我添加两个15亿时它会溢出。我希望总和结果是bigint。反正有没有实现它?提前致谢。我试过以下但没有工作。
sum(count)::bigint AS total
如果我这样做,我仍然会收到错误 sum(count :: bigint)AS total
Caused by: org.postgresql.util.PSQLException: ERROR: cannot change data type of column "total" from integer to numeric
答案 0 :(得分:3)
您应该在之前对其进行求和。那就是:
sum(count::bigint) as total
在postgres sum(整数)和sum(bigint)是不同的函数,它们分别返回整数和大整数。
事实上,所有postgres函数不仅通过名称识别,而且通过名称和参数类型的组合来识别。
如果之前没有强制转换,那么最终会使用sum()的整数版本,它总是返回整数。即使您稍后将其投放到bigint。如果结果是溢出,则无法将溢出转换为bigint。
编辑:正如abelisto正确指出的那样,sum()还会为smallint和整数返回bigint。但是,正如我所看到的,您的错误消息表明“无法将列总数从整数更改为数字”。但据我了解,“总数”是整个操作的结果,所以它应该是bigint(即使溢出)。
...不确定它是否试图指向“计数”列(在操作之后)被标记为“总计”(但它让我感到困惑......)或者它只是说它不能投数字到bigint(这对我来说似乎更可行)。它取决于 count 列的实际类型。它已经是bigint还是数字?
如果是的话,问题可能在于试图将bigint一个非常庞大的数字(我的意思是 numeric 类型)转换为值。
你能告诉我们“计数”colunm的确切类型吗?更好的是:你能提供一个具有文字价值的失败例子吗?
类似的东西(但我只有一个“bigint超出范围”错误......):
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