7

我一直在搜索这个站点,以了解如何将 select 语句的结果转储到数组中,这样我就可以遍历数组。但是我还没有幸运地找到一个简单的例子。下面的代码是我所做的一个例子。但是我无法弄清楚如何使用数组来做到这一点。只有一个行结构。每当我尝试将查询结果分配给数组时,我都会收到此子查询错误(即类似于“array := (select...from sometable)”之类的东西,我理解,但必须有办法做到这一点。谢谢(补充:我在这个实际代码下面更喜欢的伪代码)。

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 $$;

希望这可以解决问题。

4

1 回答 1

2

鉴于您尝试这样做的原因是“性能”,请考虑以下事项:

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