drop function if exists selfAndChildrenIds; drop function if exists selfAndParentIds; create or replace function self_and_children_ids(tb text, id text, includeSelf bool = true) returns text[] AS $$ declare ans text[]; sql text; text1 text; begin -- logic if includeSelf then text1 = 'id' ; else text1 = 'parent_id' ; end if; sql = 'with recursive tmp as (select id from ' || tb || ' where ' || text1 || ' = $1 union all select ' || tb || '.id from ' || tb || ' inner join tmp on ' || tb || '.parent_id = tmp.id) select array_agg(id) from tmp'; execute sql into ans using id; return ans; end $$ language plpgsql ; create or replace function self_and_parent_ids(tb text, id text, includeSelf bool = true) returns text[] AS $$ declare ans text[]; sql text; begin -- logic sql = 'with recursive tmp as (select id,parent_id from ' || tb || ' where ' || 'id = $1 union all select ' || tb || '.id, ' || tb || '.parent_id from ' || tb || ' inner join tmp on ' || tb || '.id = tmp.parent_id) select array_agg(id) from tmp '; if not includeSelf then sql = sql || ' where id != $1'; end if; execute sql into ans using id; return ans; end $$ language plpgsql ;