簡體   English   中英

在Postgresql的數組數組中迭代每個元素

[英]Iterating on each element from an array of arrays on Postgresql

我的存儲過程中有一個數字的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();

提示或技巧?

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()對記錄無效,僅對數組有效。
    而且, Postgres 8.3中沒有array_length() 該手冊有助於弄清您自己。 array_upper()不太受歡迎的array_upper()

  • plpgsql中的賦值運算符是:= =使用未記錄。

  • plpgsqlLANGUAGE plpgsql的標識符,而不是字符串。 不要引用它。 可能會導致偷偷摸摸的錯誤。

  • 您可以在聲明時分配變量。

  • 沒有參數的STRICT修飾符是毫無意義的。

->適用於Postgres 8.3的SQLfiddle演示

使用現代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);

您需要升級到當前版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM