我的存储过程中有一个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();
提示或琐事?
答案 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 :=
。使用=
没有记录。
plpgsql
是LANGUAGE plpgsql
中的标识符,而不是字符串。不要引用它。可能导致偷偷摸摸的错误。
您可以在申报时分配变量。
STRICT
修饰符无参数无意义。
-> SQLfiddle demo for Postgres 8.3.
同样,这可以在一个(如果有点复杂的)调用中得到:
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);
您需要升级到当前版本。