迭代Postgresql上的数组数组中的每个元素

时间:2013-12-09 20:25:11

标签: sql arrays postgresql plpgsql postgresql-8.3

我的存储过程中有一个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迭代这些数组中的每个元素,以调用另一个程序来处理每个数组中的每个元素。

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

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();

提示或琐事?

1 个答案:

答案 0 :(得分: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);

您需要升级到当前版本。