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

时间:2016-07-22 17:59:38

标签: postgresql sum typecast-operator

我知道有人在前一段时间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

1 个答案:

答案 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