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

时间:2017-08-10 01:31:01

标签: r postgresql rpostgresql

继续这个问题和随后的答案: Appropriate values for -Infinity & Infinity in Postgres

documentation,似乎很明显realdouble 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,但是当列包含缺失值或{{1}时,这不起作用条件强加于数据库中。我想另一件事就是写一个任意大的数字。

3 个答案:

答案 0 :(得分:6)

PostgreSQL 将从 v14 开始支持数字 +inf/-inf ?

答案 1 :(得分:3)

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';

答案 2 :(得分:1)

浮点类型具有以下特殊值:

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