PostgreSQL - 选择INTO ARRAY

Gue*_*ing 6 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 $$;
Run Code Online (Sandbox Code Playgroud)

希望这能解决问题.

IMS*_*SoP 2

鉴于您尝试这样做的理由是“性能”,请考虑以下因素:

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