arrays - 合并 PostgreSQL 中的两个数组作为索引和值?

标签 arrays postgresql

假设我在表中有两个数组字段,如下所示:

 Column |   Type    |
--------+-----------+
 index  | integer[] | 
 value  | integer[] | 

其中索引和值的长度相等,并且“index”中的值保证唯一,例如:

SELECT * FROM ArrayTest;
   index   | value             
-----------+-----------------------------------
 {1,3,5,6} | {100, 103, 105, 106}

如何进行返回新数组的查询,其中“index”中的值用作数组索引,“value”中的值成为与给定索引关联的值,即类似:

SELECT some_array_function(index, value) as newarray;
            new_array
--------------------------------
{100, NULL, 103, NULL, 105, 106}

我想要实现的功能与PHP中的array_combine相同。

最佳答案

虽然总体来说像这样存储数据是一个坏主意,但一种方法是使用 unnest 函数并在客户端处理结果:

SELECT unnest(index), unnest(value) FROM ArrayTest;

 unnest | unnest 
--------+--------
      1 |    100
      3 |    103
      5 |    105
      6 |    106

如果您必须有一个函数来创建新数组,这里有一个简短的函数可以做到这一点:

CREATE FUNCTION array_stitch(index_array integer[], value_array integer[]) RETURNS integer[]
    LANGUAGE plpgsql IMMUTABLE
    AS $$
DECLARE
    ptr INTEGER;
    new_array INTEGER[];
BEGIN
    FOR ptr IN 1..array_upper(index_array,1) LOOP
            new_array[index_array[ptr]] := value_array[ptr];
    END LOOP;

    RETURN new_array;
END;
$$;

编辑:这是另一种方法:

SELECT array_agg(val order by idx) as output_array
FROM (SELECT generate_series(1,idx[array_upper(idx,1)]) from array_test) as g(idx)
LEFT JOIN (SELECT unnest(idx) as idx, unnest(val) as val FROM array_test\
    ) as data_points USING (idx);

关于arrays - 合并 PostgreSQL 中的两个数组作为索引和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6547177/

相关文章:

c++ - 如何在 C++ 中查看数组是否具有连续数字?

javascript - 使用 array.join() 内爆类名数组 javascript

mysql - 如何将 PostgreSQL 数据库中的所有 SMALLINT 列转换为 BOOLEAN?

postgresql - MySQL 5 到 PostgreSQL 8.4,区分大小写的约定,我应该与 PostgreSQL 保持一致吗

c - 处理二维数组时出现总线错误

javascript - 基于变量数组顺序执行异步方法

postgresql - PG 8.3,磁盘已满,服务器无法启动

postgresql - Autovacuum 和分区表

c++ - 初始化数组

json - postgresql文本到json的转换