PostgreSQL - 选择INTO ARRAY

时间:2013-09-20 20:22:53

标签: postgresql multidimensional-array

我一直在搜索这个网站,以了解如何将select语句的结果转储到数组中,因此我可以遍历数组。但是我没有幸运地找到一个简单的例子。下面的代码是我所做的一个例子。但是,我无法弄清楚如何使用数组执行此操作。只有一行构造。每当我尝试将查询结果分配给数组时,我都会得到这个子查询错误(例如“array:=(select from from sometable)”,我理解,但必须有一种方法可以做到这一点。谢谢事先。(补充:PSeudo-Code,我更喜欢这个实际代码)。

DO
$$
DECLARE
    nRowCount          bigint;
    i                  record;
BEGIN

DROP TABLE IF EXISTS companies_sample_db_temp;
CREATE TABLE companies_sample_db_temp (
col1     varchar
, col2     varchar
, col3     varchar
);

INSERT INTO companies_sample_db_temp VALUES ('McDonalds','Los Angeles','CA');
INSERT INTO companies_sample_db_temp VALUES ('Starbucks','Seattle','WA');
INSERT INTO companies_sample_db_temp VALUES ('Oracle','San Francisco','CA');

-- SELECT * FROM companies_sample_db_temp;

FOR i IN
  with a as
  (
    SELECT
    ARRAY[col1::text
          , col2::text
          , col3::text                    
    ] as coltext
    FROM companies_sample_db_temp AS my_arr
  )
  select row_number() over(), coltext from a
LOOP
--    RAISE INFO 'nRowCount: %', nRowCount;
     RAISE INFO 'Array Info: %', i.coltext[1];
END LOOP;

END
$$;

/*********** Pseudo Code of what I'd rather do *******************/
DO
$$
DECLARE
    -- Assign results of this query to an array
    my_arr := SELECT col1, col2,col3 FROM companies_sample_db_temp;
    i                  record;

BEGIN
-- Loop through an "array" not a table using a select statement.
FOR i IN
    -- Iterate through each row of the array
    my_arr[i] -- Row from the select query
    LOOP
       -- Display an elements within a single array row
       RAISE INFO 'Array Info: %', my_arr[i][1]; -- col1
       RAISE INFO 'Array Info: %', my_arr[i][2]; -- col2
       RAISE INFO 'Array Info: %', my_arr[i][3]; -- col3
END LOOP;
END $$;

希望这能解决问题。

1 个答案:

答案 0 :(得分:1)

鉴于您尝试此操作的原因是“性能”,请考虑以下事项:

  1. 表和行(或者,在非SQL术语中,关系和元组)是Postgres的面包和黄油;如果他们效率不高,那将是一个非常糟糕的DBMS。
  2. “过早优化”通常会产生反效果:您认为可能对性能产生影响的事情花费的时间越早,您以后修复做的事情的时间就越少/ em>有性能影响。如果你将一个进程封装在一个函数中,那么这是一个强调简单性和可维护性的好地方,因为如果你发现它实际上给你带来了问题,你可以在以后替换一个新的实现。
  3. DBMS甚至拥有数组类型是非常罕见的,并且任何似乎需要在数据库函数中循环的问题通常都可以重新构建为针对一组数据的操作,并且解决方案变成了SQL。 DBMS 可能决定在内部使用循环,但99%的情况下,做出决定比你更好。
  4. 你提到“记忆变量”;我不太清楚你的意思是什么(当它被操作时所有内存都在记忆中),但听起来你正在深入猜测不同的数据类型将如何在“引擎盖下”工作。动态数组和一组记录都是需要管理的复杂数据结构; 任何语言没有根本原因为什么一个人会更有效率,除了语言往往针对某些情况进行优化。 (因此见第1点。)