Could someone help me fix my array_list function? - Mailing list pgsql-sql
From | Guy Fraser |
---|---|
Subject | Could someone help me fix my array_list function? |
Date | |
Msg-id | 3E2C44F3.8010602@incentre.net Whole thread Raw |
Responses |
Re: Could someone help me fix my array_list function?
|
List | pgsql-sql |
Hi I am trying to write a function to step through an array and output each value as a set {list}, I think. This is what I want to do: select attribute,array_list(values,1,sizeof(values)) as value from av_list; Turn : attr6 | {val3,val7,val4,val5} Into : attr6 | val3 attr6 | val7 attr6 | val4 attr6 | val5 Below I have included my functions, a test query, a table definition and some sample data. If anyone already has a function to do this I would be elated. Note: text array_dims(array[]); function existed on the machine I started this on, but does not exist on my machine at home. It outputs a text value like '[1:1]' when there is only one item in the array and '[1:6]' when there is six items. My functions expect that function to exist. Any help would be apreciated. Guy The entire selection below can be pasted to a shell, it will create a test database "testdb" add plpgsql to the database then create the functions, and a populated table before running a test query. ---%<...Cut Here... createdb testdb createlang plpgsql testdb echo " --###Start of Functions### -- Array dimension functions. -- -- Throw away old version of function DROP FUNCTION array_diml(text[]); -- -- Return the start 'left' dimension for the text array. CREATE FUNCTION array_diml(text[])RETURNS int2AS 'select int2(ltrim(rtrim(rtrim(array_dims($1),\']012345679\'),\':\'),\'[\')) AS RESULT;'LANGUAGE sqlWITH (iscachable,isstrict) ; -- -- Throw away old version of function DROP FUNCTION array_dimr(text[]); -- -- Return the end 'right' dimension for the text array. CREATE FUNCTION array_dimr(text[])RETURNS int2AS 'select int2(rtrim(ltrim(ltrim(array_dims($1),\'[012345679\'),\':\'),\']\')) AS RESULT;'LANGUAGE sqlWITH (iscachable,isstrict) ; -- -- Throw away old version of function DROP FUNCTION array_list(text[],smallint); -- -- Iterate array and post results CREATE FUNCTION array_list(text[],smallint) RETURNS SETOF text AS ' DECLARE inarray ALIAS FOR $1; dim ALIAS FOR $2; BEGIN FOR counter IN 1..dim LOOP RAISE NOTICE ''Getting element % of %'',counter,inarray; RETURN inarray[counter]; END LOOP; END; ' LANGUAGE 'plpgsql'; --###End of Functions### --###Start of test query### -- -- Get a list with each destination for each mailbox SELECT a_mailbox, array_list(a_destination, array_dimr(a_destination)) FROM mail_aliases; --###End of test query### --###Start of table and sample data### DROP TABLE mail_aliases; CREATE TABLE mail_aliases( a_mailbox text, a_destination text[] ); COPY mail_aliases FROM stdin USING DELIMITERS ':'; alias1:{dest1} alias2:{dest2,dest1} alias3:{dest3,dest4} alias4:{dest3,dest4,dest5} alias5:{dest6,dest7} alias6:{dest3,dest7,dest4,dest5} \. --###End of table and sample data### --###Start of test query### -- -- Get a list with each destination for each mailbox SELECT a_mailbox, array_list(a_destination, array_dimr(a_destination)) FROM mail_aliases; --###End of test query### " | psql testdb ---%<...Cut Here...