在ARRAY中组合日期和整数

时间:2013-01-29 23:19:56

标签: arrays postgresql multidimensional-array postgresql-9.2

如何选择array_agg(ARRAY[f1_date,ARRAY[f2_int,f3_decimal]])?关于在ARRAY中合并dateinteger的错误。

upd:添加了图片,解释了我计划使用数组的位置和方式。问题是数据库大小。将3个colunms转换为多维数组后,我可以节省大量空间。它将是4M行而不是200M。每行将包含最多500个元素的数组。

enter image description here

2 个答案:

答案 0 :(得分:2)

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

匿名记录数组

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

SELECT array_agg((i,d))
FROM  (
   VALUES
     (1::int, 2.3::decimal)
    ,(2, 3.4)
    ,(3, 4.5)
   ) x(i, d);

这是相当笨重的,因为你不能按名称访问匿名记录的子字段(名称不存在!)。使用众所周知的类型操作可能更实用。

复合类型作为基本类型

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

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)"}

Text为共同基础

另一种方法是将所有值转换为text,因为每个数据类型都可以转换为text并返回PostgreSQL并构建multi-dimensional array。< / p>

为此,您可能有兴趣聚合多维数组。考虑这个相关问题的答案:
Selecting data into a Postgres array

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

答案 1 :(得分:0)

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

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