update and group by/aggregate - Mailing list pgsql-general

From Ivan Sergio Borgonovo
Subject update and group by/aggregate
Date
Msg-id 20080827103243.66238e05@dawn.webthatworks.it
Whole thread Raw
Responses Re: update and group by/aggregate  ("Pavel Stehule" <pavel.stehule@gmail.com>)
Re: update and group by/aggregate  (Sam Mason <sam@samason.me.uk>)
Re: loop vs. aggregate was: update and group by/aggregate  (Ivan Sergio Borgonovo <mail@webthatworks.it>)
List pgsql-general
How can I update catalog_items.Authors

create table catalog_items(
  ItemID bigint primary key,
  Authors varchar(1024)
);

taking results from

select ia.ItemID, array_accum(trim(' \t]' from a.Name))
  from catalog_itemauthor ia
  join catalog_author a on a.AuthorID=ia.AuthorID
  where a.Name is not null and length(trim(' \t' from a.Name))>1
  group by ia.ItemID;

Currently I'm achieving the same result with a plpsql function with
a for loop, and I'm planning to see if using aggregates is going to
be faster and then see if it is even worth to keep an extra column...

create or replace function UpdateAuthors()
returns void
as
$$
declare
  _row record;
  _ItemID bigint;
  _Authors varchar(1024);
  _Name varchar(50);
begin
  _Authors:='';
  _ItemID:=null;
  for _row in select a.Name, ia.ItemID from {catalog_itemauthor} ia
    join {catalog_author} a on a.AuthorID=ia.AuthorID
    order by ia.ItemID
      loop
    if(_row.ItemID<>_ItemID) then
      if(length(_Authors)>2) then
        _Authors:=substring(_Authors from 3);
        update {catalog_items} set Authors=_Authors
          where ItemID=_ItemID;
      end if;
      _Authors:='';
    end if;
    _ItemID:=_row.ItemID;
    _Name:=trim(' \t' from _row.Name);
    if(length(_Name)>0) then
      _Authors:= _Authors || ', ' || _Name;
    end if;
  end loop;
return;
end;
$$ language plpgsql volatile;

BTW
I've noticed that array_append gives back not uniform results:

select array_append(ARRAY['az','e','i'],'');
{az,e,i,""}
while I'd expect
{"az","e","i",""}

--
Ivan Sergio Borgonovo
http://www.webthatworks.it


pgsql-general by date:

Previous
From: "Teemu Juntunen"
Date:
Subject: ENABLE / DISABLE ALL TRIGGERS IN DATABASE
Next
From: "Pavel Stehule"
Date:
Subject: Re: update and group by/aggregate