Поддерживает ли числовой тип PostgreSQL бесконечность (и -бесконечность)?

Исходя из этого вопроса и последующих ответов: Подходящие значения для -Infinity & Infinity в Postgres

и документацию, очевидно, что число real и double precision типы поддерживают как положительную, так и отрицательную бесконечность. Однако для типа numeric не упоминается, за исключением того, что range не имеет «ограничения».

Поддерживается ли положительная и отрицательная бесконечность для типов numeric (в PostgreSQL 9.5), и если да, то как вставлять такие значения?

РЕДАКТИРОВАТЬ (как было предложено @TimBiegeleisen): Причина, по которой это произошло, заключается в том, что я пытаюсь записать числовой столбец из R в таблицу базы данных. Столбец содержит Inf значений, но использует dbWriteTable из RPostgreSQL ошибок с:

Error in postgresqlgetResult(new.con) : 
  RS-DBI driver: (could not Retrieve the result : 
ERROR:  invalid input syntax for type numeric: "Inf"

В моем конкретном случае я могу преобразовать Inf в NA и записать эти значения как NULL, но это не работает, когда столбец содержит пропущенные значения или в базе данных наложено условие not null. Я полагаю, что еще одна вещь, которую нужно сделать, - это написать произвольно большое число.


person Alex    schedule 10.08.2017    source источник


Ответы (3)


NUMERIC не поддерживает +-бесконечность, хотя и поддерживает NaN. Это довольно неудачное ограничение. Для решения этой проблемы, вероятно, потребуется изменить двоичный формат numeric на диске, что может оказаться сложной задачей...

craig=> SELECT NUMERIC 'NaN';
 numeric 
---------
     NaN
(1 row)

craig=> SELECT NUMERIC '-inf';
ERROR:  invalid input syntax for type numeric: "-inf"
LINE 1: SELECT NUMERIC '-inf';
                       ^
craig=> SELECT NUMERIC '+inf';
ERROR:  invalid input syntax for type numeric: "+inf"
LINE 1: SELECT NUMERIC '+inf';

craig=> SELECT NUMERIC '+infinity';
ERROR:  invalid input syntax for type numeric: "+infinity"
LINE 1: SELECT NUMERIC '+infinity';
                       ^
craig=> SELECT NUMERIC 'infinity';
ERROR:  invalid input syntax for type numeric: "infinity"
LINE 1: SELECT NUMERIC 'infinity';
                       ^
craig=> SELECT NUMERIC '-infinity';
ERROR:  invalid input syntax for type numeric: "-infinity"
LINE 1: SELECT NUMERIC '-infinity';
person Craig Ringer    schedule 10.08.2017

PostgreSQL будет поддерживать числовые +inf/-inf начиная с версии 14 ????

person piro    schedule 31.01.2021

Типы с плавающей запятой имеют следующие специальные значения:

Infinity
-Infinity
NaN

Это имело место еще в v8.2 и до сих пор актуально.

(Ссылка: https://www.postgresql.org/docs/9.6/static/datatype-numeric.html)


РЕДАКТИРОВАТЬ: я вижу проблему, которую вы пытаетесь решить. Исходя из математического фона, я понимаю, почему вам могут понадобиться, например, целые значения, включая положительную и отрицательную бесконечность, и NaN (для асимптот, пределов и т. д.). К сожалению, в PostgreSQL нет таких значений для целых или десятичных типов. Однако вы могли поиздеваться над ним, указав два столбца:

"myNumeric" NUMERIC,
"myNumericSpecialInformation" REAL

Затем в столбце myNumericSpecialInformation либо сохраните NULL, если нет специальной информации, либо сохраните (согласно требованию) Infinity, -Infinity или NaN и обработайте заполнение и управление этими значениями в бизнес-логике вашего приложения.

person e_i_pi    schedule 10.08.2017
comment
но numeric не является типом с плавающей запятой, верно? Кроме того, это сбивает с толку, поскольку в нем говорится, что для диапазона numeric нет ограничений, поэтому я предполагаю, что он поддерживает бесконечность? - person Alex; 10.08.2017
comment
@Alex Если вы посмотрите эту демонстрацию, вы увидите, что приведение бесконечного числа с плавающей запятой к числовому не дает результата, который вы могли бы ожидать. - person Tim Biegeleisen; 10.08.2017
comment
о, Боже. Спасибо @TimBiegeleisen. Таким образом, числовое значение не поддерживает бесконечность. - person Alex; 10.08.2017
comment
@ Алекс Я не совсем уверен в этом, но похоже, что приведение одного к другому не сработает. Возможно, вы могли бы уточнить свой вопрос, почему вам нужна поддержка бесконечности; может быть обходной путь. - person Tim Biegeleisen; 10.08.2017
comment
См. мой отредактированный ответ, который обеспечивает обходной путь, но при этом использует специальные значения, доступные в типе float. - person e_i_pi; 10.08.2017
comment
к сожалению, numeric поддерживает только конечные числа, и я думаю, что есть еще ограничение в 2 миллиарда цифр. - person Jasen; 10.08.2017