Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to loop through string[] in postgresql?

In this postgressql function i created a array by spliting a string. Now i want loop on this array and do some processing on it.

Function:

CREATE OR REPLACE FUNCTION getAllFoo() RETURNS character varying as
$BODY$
DECLARE
   arr_split_data text[];
   counter character varying;
begin

    counter := ''; -- Init value

    -- split data. Add in array
    select into arr_split_data regexp_split_to_array('a,b,c,d,e,f',',');

    FOR r IN arr_split_data -- error
    LOOP
         counter := arr_split_data[r] || '_' || counter; -- do some processing
    END LOOP;

  return counter;
END
$BODY$
LANGUAGE 'plpgsql';

But I am getting this error

error

when I execute this function. Is my syntax for loop is wrong?

like image 489
Deepak gupta Avatar asked Oct 29 '25 03:10

Deepak gupta


2 Answers

The syntax is

FOREACH r IN ARRAY arr_split_data
LOOP
  counter := r || '_' || counter;
  -- do some processing
END LOOP;

You'll need to declare r too:

DECLARE
    arr_split_data TEXT [];
    r              CHARACTER VARYING;
    counter        CHARACTER VARYING;
BEGIN

See section 41.6.5 of the manual: Looping Through Arrays

like image 57
teppic Avatar answered Oct 31 '25 16:10

teppic


    CREATE OR REPLACE FUNCTION getAllFoo() RETURNS character varying as
    $BODY$
    DECLARE
        r               character varying;    
        arr_split_data  text[];
        counter         character varying;
    begin
        counter := ''; -- Init value

        -- split data. Add in array
        select into arr_split_data regexp_split_to_array('a,b,c,d,e,f',',');

        FOREACH r IN array arr_split_data LOOP
            counter := counter || '_' || r; -- do some processing
        END LOOP;
        return counter;

    END
    $BODY$
    LANGUAGE 'plpgsql';
like image 34
Deepak gupta Avatar answered Oct 31 '25 18:10

Deepak gupta