Arrays 在数组中组合日期和整数

Arrays 在数组中组合日期和整数,arrays,postgresql,multidimensional-array,postgresql-9.2,Arrays,Postgresql,Multidimensional Array,Postgresql 9.2,如何选择数组(数组[f1\U日期,数组[f2\U整数,f3\U小数]])?在数组中组合日期和整数时出错。 upd:添加了说明我计划在何处以及如何使用阵列的图片。问题是数据库大小。将3列转换为多维数组后,我可以节省大量空间。它将是4米而不是200米。每行将具有最多500个元素的数组 我认为PostgreSQL不支持组合多种类型的数组。它应该是所有日期或所有整数,但不能两者混合在一起 现在,如果你真的想把两者结合起来,你可以把日期转换成整数,但是使用。例如,1359478323代表ISO 8601:

如何选择数组(数组[f1\U日期,数组[f2\U整数,f3\U小数]])?在数组中组合
日期
整数
时出错。

upd:添加了说明我计划在何处以及如何使用阵列的图片。问题是数据库大小。将3列转换为多维数组后,我可以节省大量空间。它将是4米而不是200米。每行将具有最多500个元素的数组


我认为PostgreSQL不支持组合多种类型的数组。它应该是所有日期或所有整数,但不能两者混合在一起


现在,如果你真的想把两者结合起来,你可以把日期转换成整数,但是使用。例如,1359478323代表ISO 8601:2013-01-29 16:52:03Z。几乎在任何编程语言中都可以找到双向转换库。

Postgres中的数组在所有维度上共享相同的基本元素

匿名记录数组 您可以构建匿名记录数组(作为基类型):

但这相当笨拙,因为您无法按名称访问匿名记录的子字段(名称不存在!)。与熟悉的类型一起操作可能更实际

复合类型作为基类型 创建复合类型并将其用作数组的基类型

CREATE TYPE int_dec AS (i int, d decimal);

SELECT '(1, 2.3)'::int_dec AS id_base
      ,'{"(1, 2.3)","(2, 3.4)","(3, 4.5)"}'::int_dec[] AS id_arr

-- Build an array from composite base type
SELECT array_agg(a)
FROM (
    VALUES
      ('(1, 2.3)'::int_dec)
     ,('(2, 3.4)'::int_dec)
     ,('(3, 4.5)'::int_dec)
    ) x(a);

-- Build an array from composite base type
SELECT array_agg((i,d)) AS anonymous_arr
      ,array_agg((i,d)::int_dec) AS id_arr
FROM  (
   VALUES
     (1::int, 2.3::decimal)
    ,(2, 3.4)
    ,(3, 4.5)
   ) x(i, d);
表作为基本类型 任何表都可以用作复合类型

db=# CREATE TEMP TABLE int_dec (i int, d decimal);
CREATE TABLE
db=# INSERT INTO int_dec VALUES (1, 2.3), (2, 3.4), (3, 4.5);
INSERT 0 3
db=# SELECT array_agg(id) FROM int_dec id;
            array_agg
---------------------------------
 {"(1,2.3)","(2,3.4)","(3,4.5)"}
文本
作为共同点 另一种方法是将所有值强制转换为
文本
,因为每个数据类型都可以强制转换为
文本
,然后返回到PostgreSQL中,并构建一个
多维数组

为此,您可能对聚合多维数组感兴趣。考虑下面这个问题的答案:


根据我的经验,通常有比构建复杂数组更好的解决方案。

我正在寻找欺骗这一规则的最佳方法,例如将日期保持为“20130129”整数格式。我更新了我的答案,参考了一些最佳实践。因为我需要多维数组,唯一的方法是将所有元素转换为文本,对吗?A添加了一些解释-也许这会更好地澄清我的问题。@revoua:这是一种方法,但不是唯一的方法。您可以在一个复合类型上构建一个数组,该复合类型由我的答案中概述的
date
和复合
int\u dec
组成。如果你不知道自己在做什么,我建议你保留桌子。RDBMS在许多方面都是表的最佳选择。
db=# CREATE TEMP TABLE int_dec (i int, d decimal);
CREATE TABLE
db=# INSERT INTO int_dec VALUES (1, 2.3), (2, 3.4), (3, 4.5);
INSERT 0 3
db=# SELECT array_agg(id) FROM int_dec id;
            array_agg
---------------------------------
 {"(1,2.3)","(2,3.4)","(3,4.5)"}