【问题标题】:Iterating on each element from an array of arrays on Postgresql从 Postgresql 上的数组数组中迭代每个元素
【发布时间】:2013-12-27 02:49:46
【问题描述】:

我的存储过程中有一个数字的 VARCHAR,这些数字被组织为数组,我将在下面展示一个示例:

{1,2,3,4,5,6,7,8,9},{1,2,3,4,5},{1,2,3},{9} -- This is a STRING

现在在另一个人的帮助下,我正在使用它来获取整数数组 integer[]

SELECT string_to_array(regexp_split_to_table(
      trim('{1,2,3,4,5,6,7,8,9},{1,2,3,4,5},{1,2,3},{9}', '{}')
      , '},{'), ',')::int[]

我会有一组记录,每条记录都有一个数组,见下图:

{1,2,3,4,5,6,7,8,9}
{1,2,3,4,5}
{1,2,3}
{9}

我正在尝试,但我不知道如何创建 FOR 来迭代这些数组中的每个元素,以调用另一个过程来处理每个数组中的每个元素。

我将调用my_array 的数组{1,2,3,4,5,6,7,8,9} 的示例:

rec record;
arr integer[];

FOR rec IN SELECT string_to_array(unnest(string_to_array(trim(text_nodes_for_connectivity, '{}'), '},{')), ',')::int[] LOOP
    arr := array_cat(arr, rec);
END LOOP;

我收到此错误:

function array_cat(integer[], record) does not exist

我需要将我的每个记录结果转换为一个数组,所以我可以使用 array_cat 或其他函数来迭代数组元素

我的 proc 代码如下:

DROP FUNCTION IF EXISTS clustering_nodes();
CREATE OR REPLACE FUNCTION clustering_nodes() RETURNS integer[] AS $$

DECLARE
my_array integer[];
rec record;
arr integer[];
my_var varchar[500];
len integer;

BEGIN

my_var = '{1,2,3,4,5,6,7,8,9},{1,2,3,4,5},{1,2,3},{8}';


FOR rec IN SELECT string_to_array(unnest(string_to_array(trim(my_var, '{}'), '},{')), ',')::int[] LOOP
    len = array_length(rec);
    arr := array_append(arr, len);
END LOOP;

RETURN arr;

END;

$$ LANGUAGE 'plpgsql' STRICT;

select clustering_nodes();

提示还是技巧?

【问题讨论】:

  • 嗯,你的 FOR 循环看起来不错。我们需要更多来确定问题。错误消息,开始。包括标题在内的整个 pgsql 函数也会很棒。
  • 我更新了我的问题,所以我想循环 SELECT 返回给我的每条记录,并将它们中的每一条作为一个独立的数组进行操作
  • The whole pgsql function including the header 以及函数调用。对您的问题至关重要。
  • 附上我的 proc 代码!

标签: sql arrays postgresql plpgsql postgresql-8.3


【解决方案1】:
CREATE OR REPLACE FUNCTION clustering_nodes()
  RETURNS integer[] AS
$func$
DECLARE
   my_var   text  := '{1,2,3,4,5,6,7,8,9},{1,2,3,4,5},{1,2,3},{8}';
   my_array integer[];
   arr_len  integer[];
BEGIN

FOR my_array IN
   SELECT string_to_array(regexp_split_to_table(
            trim(my_var, '{}'), '},{'), ',')::int[]
LOOP
   arr_len := array_append(arr_len, array_upper(my_array, 1));
END LOOP;

RETURN arr_len;

END
$func$ LANGUAGE plpgsql;

要点

  • array_length() 不适用于记录,仅适用于数组。
    更重要的是,还有no array_length() in Postgres 8.3。该手册有助于您自己弄清楚这一点。改用不太受欢迎的array_upper()

  • Assignment operator in plpgsql is :=。没有记录使用=

  • plpgsqlLANGUAGE plpgsql 中的标识符,而不是字符串。不要引用它。可能会导致偷偷摸摸的错误。

  • 您可以在声明时分配变量。

  • STRICT 修饰符没有参数是没有意义的。

-> SQLfiddle demo for Postgres 8.3.

现代 Postgres 更简单

同样,这可以在单个(如果有些复杂)调用中完成:

SELECT array_agg(array_length(string_to_array(txt, ','), 1))
FROM   unnest(string_to_array(
          trim('{1,2,3,4,5,6,7,8,9},{1,2,3,4,5},{1,2,3},{8}', '{}')
          , '},{')
       ) AS sub(txt);

您需要升级到当前版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多