Postgres - как преобразовать сумму (bigint) в bigint?

У меня есть таблица Postgres 8.2 со столбцами, определенными как тип данных bigint.

Когда я делаю sum(column), возвращаемый тип — numeric. Я хочу, чтобы тип суммирования был равен bigint, так как я точно знаю, что результат не превысит максимальное значение bigint. Я смог добиться этого, используя такой подзапрос:

select T.big_col_total::bigint from (select sum(big_col) as big_col_total from big_table) T;

Есть ли способ сделать это без использования подзапроса, т. Е. Могу ли я каким-то образом напрямую привести тип sum? Я попробовал несколько способов, и оба приводят к синтаксической ошибке.

(предыстория: я запускаю этот запрос из Hibernate, поэтому для меня важно сохранить тип возвращаемых данных из запроса, ограниченный BigInteger. bigint + bigint = numeric (BigDecimal на стороне Java)


person Say No To Censorship    schedule 05.12.2012    source источник


Ответы (1)


Просто используйте:

select sum(big_col)::bigint as total 
from big_table

И вам следует как можно скорее перейти на поддерживаемую версию (например, 9.x).

person a_horse_with_no_name    schedule 05.12.2012
comment
Я получаю эту ошибку при выполнении вышеуказанного запроса из Hibernate. org.hibernate.QueryException: Not all named parameters have been set: [:bigint, :] Если я изменяю sum(big_col)::bigint на sum(big_col) :: bigint (с пробелами в ч/б), я все равно получаю ту же ошибку. Hibernate, кажется, думает, что :bigint является именованным параметром, есть идеи, как это обойти? Спасибо! - person Say No To Censorship; 06.12.2012
comment
@svhyd: попробуйте вместо этого cast(sum(big_col) AS bigint). Кажется, это не удается, потому что двоеточие (:) имеет особое значение в Hiberante. Вам придется экранировать символ или вместо этого использовать представленный альтернативный синтаксис. - person Erwin Brandstetter; 06.12.2012
comment
Спасибо, это сработало! select cast(sum(big_col) AS bigint) AS total from big_table - person Say No To Censorship; 06.12.2012