gpt4 book ai didi

PostgreSQL - 选择进入数组

转载 作者:行者123 更新时间:2023-11-29 11:25:48 25 4
gpt4 key购买 nike

我一直在搜索这个站点,以了解如何将 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 $$;

希望这能解决问题。

最佳答案

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

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

关于PostgreSQL - 选择进入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18925238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com