PostgreSQL 数字类型是否支持无穷大(和 -infinity)?

Does PostgreSQL numeric type support infinity (and -infinity)?

根据这个问题和随后的回答: Appropriate values for -Infinity & Infinity in Postgres

documentation,很明显realdouble precision数字类型支持正无穷大和负无穷大。但是,除了 range 有 "no limit" 之外,没有提到 numeric 类型。

numeric 类型是否支持正无穷大和负无穷大(在 PostgreSQL 9.5 中),如果支持,如何插入此类值?

编辑(如@TimBiegeleisen 所建议): 出现这种情况的原因是因为我正在尝试将数字列从 R 写入数据库 table。该列包含 Inf 值,但使用 RPostgreSQL 中的 dbWriteTable 错误:

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 条件强加于数据库。我想另一件事是写一个任意大的数字。

浮点类型有以下特殊值:

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-InfinityNaN,并在您的应用程序业务逻辑中处理这些值的填充和管理。

NUMERIC 不支持 +-infinity,尽管它支持 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';

PostgreSQL 将从 v14

开始支持数字 +inf/-inf