arrays - 将日期和整数合并到 ARRAY 中

标签 arrays postgresql multidimensional-array postgresql-9.2

如何选择array_agg(ARRAY[f1_date,ARRAY[f2_int,f3_decimal]])?在 ARRAY 中组合 dateinteger 时出现错误。

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

enter image description here

最佳答案

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 并返回到 PostgreSQL 并构建 多维数组.

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

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

关于arrays - 将日期和整数合并到 ARRAY 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14593906/

相关文章:

java - 如何创建一个只有文本名称的类的数组?

.net - 如何一次检查多个值的存在

python - 两个二维数组从哪里开始相互重叠?

javascript - 动态创建 Javascript 对象数组

php - 阵列取消设置键

对数组类型的表达式进行 C 错误赋值

php - 在 PHP 中从 while 循环构建单个数组时遇到问题

postgresql - 基于 SELECT 条件的 postgres 约束

sql - 如何获取唯一的 id 对行?

c - C中int数组的二维数组?