Приведение типов суммы PostgreSQL как bigint

Я выполняю sum() целочисленного столбца и хочу привести результат к типу bigint, чтобы избежать ошибки. Однако, когда я пытаюсь использовать sum(myvalue)::bigint, это все равно выдает ошибку вне допустимого диапазона.

Есть ли что-нибудь, что я могу сделать с запросом, чтобы заставить это работать? Или мне нужно изменить тип столбца на bigint?


person Aaron Kreider    schedule 25.11.2013    source источник
comment
Попробуйте сумму (myvalue:: bigint)   -  person Nisan.H    schedule 26.11.2013
comment
sum(myvalue)::bigint означает вычисление агрегатной функции sum по myvalue, а затем приведение результата к bigint, поэтому к моменту приведения sum() уже выбрал тип результата.   -  person IMSoP    schedule 26.11.2013
comment
Из документа 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 суммой целых чисел, скорее всего, сначала потерпит неудачу по другим причинам (например, по дисковому пространству, пропускной способности ввода-вывода и т. д.). Хотя я видел несколько крайних случаев, когда он действительно переполнялся.   -  person Nisan.H    schedule 26.11.2013


Ответы (3)


Результат явно больше, чем может содержать bigint:

-9223372036854775808 to +9223372036854775807

В таком случае Postgres возвращает numeric. Вам не нужно ничего делать, это должно просто работать без явного приведения.

Если это не так, вы можете привести базовый тип к bigint, тем самым заставив результат быть numeric в любом случае.

SELECT sum(myvalue::int8) ...
person Erwin Brandstetter    schedule 25.11.2013
comment
Хорошая догадка, но я должен был указать, что значения находятся в диапазоне bigint. - person Aaron Kreider; 26.11.2013
comment
@AaronKreider: Как правило, вы должны предоставить определение таблицы (то, что вы получаете от psql с помощью \d mytable) и быть более конкретным. Значения все еще неоднозначны... - person Erwin Brandstetter; 26.11.2013

Я решил свою проблему, используя следующий оператор

SUM(CAST(gross_amount AS Integer))

Это дает результат столбца как SUm bigint,

Примечание. Мой столбец Gross_Amount был двойного типа.

person Prabin Poudel    schedule 07.09.2017

Вам нужно привести его перед выполнением операции:

SUM(myvalue::bigint)
person Gunar Gessner    schedule 14.02.2019