Thread: casting to arrays

casting to arrays

From
Mike Rylander
Date:
I have a rather odd table structure that I would like to simplify to be a view 
(for some definition of simplify).  The current idea I have is to shovel 
values from multiple rows in one table into an array in the view.  The tables 
look something like this:

create table person ( id  serial, name  varchar
);

create table stuff ( person_id references person (id) on delete restrict, stuff_name varchar
);

The view would go something like:

create view person_with_stuff as select p.id as id,          p.name as name,          ( select s.stuff_name
fromstuff            where s.person_id = p.id          )::varchar[] from person p;
 

Is anything like this possible?  I know this may not be good form, but 
unfortunately (or perhaps fortunately, since it means I have a job) there are 
business reasons for this, supporting old apps and such.

Thanks in advance!
-- 
Mike Rylander


Re: casting to arrays

From
Joe Conway
Date:
Mike Rylander wrote:
> I have a rather odd table structure that I would like to simplify to be a view 
> (for some definition of simplify).  The current idea I have is to shovel 
> values from multiple rows in one table into an array in the view.  The tables 
> look something like this:
> 
<snip>
> 
> Is anything like this possible?  I know this may not be good form, but 
> unfortunately (or perhaps fortunately, since it means I have a job) there are 
> business reasons for this, supporting old apps and such.
> 

Not possible in current releases, but it will be in 7.4 (about to start 
beta). It looks like this:

create table person (id  integer, name  varchar);
insert into person values(1,'Bob');
insert into person values(2,'Sue');

create table stuff (person_id integer, stuff_name text);
insert into stuff values(1,'chair');
insert into stuff values(1,'couch');
insert into stuff values(1,'lamp');
insert into stuff values(2,'table');
insert into stuff values(2,'shirt');

create or replace view person_with_stuff as select p.id as id, p.name as 
name, ARRAY(select s.stuff_name from stuff s where s.person_id = p.id) 
as stuff from person p;

regression=# select * from person_with_stuff; id | name |       stuff
----+------+--------------------  1 | Bob  | {chair,couch,lamp}  2 | Sue  | {table,shirt}
(2 rows)

HTH,

Joe



Re: casting to arrays

From
Mike Rylander
Date:
Thank you!  This is great news.  Is there a projected release date for 7.4?  
Also, is there a published roadmap, or should I just get on the developers 
list?

Thanks again.
---
Mike Rylander

On Friday 18 July 2003 05:34 pm, Joe Conway wrote:
> Mike Rylander wrote:
> > I have a rather odd table structure that I would like to simplify to be a
> > view (for some definition of simplify).  The current idea I have is to
> > shovel values from multiple rows in one table into an array in the view. 
> > The tables look something like this:
>
> <snip>
>
> > Is anything like this possible?  I know this may not be good form, but
> > unfortunately (or perhaps fortunately, since it means I have a job) there
> > are business reasons for this, supporting old apps and such.
>
> Not possible in current releases, but it will be in 7.4 (about to start
> beta). It looks like this:
>
> create table person (id  integer, name  varchar);
> insert into person values(1,'Bob');
> insert into person values(2,'Sue');
>
> create table stuff (person_id integer, stuff_name text);
> insert into stuff values(1,'chair');
> insert into stuff values(1,'couch');
> insert into stuff values(1,'lamp');
> insert into stuff values(2,'table');
> insert into stuff values(2,'shirt');
>
> create or replace view person_with_stuff as select p.id as id, p.name as
> name, ARRAY(select s.stuff_name from stuff s where s.person_id = p.id)
> as stuff from person p;
>
> regression=# select * from person_with_stuff;
>   id | name |       stuff
> ----+------+--------------------
>    1 | Bob  | {chair,couch,lamp}
>    2 | Sue  | {table,shirt}
> (2 rows)
>
> HTH,
>
> Joe



Re: casting to arrays

From
Joe Conway
Date:
Mike Rylander wrote:
> Thank you!  This is great news.  Is there a projected release date for 7.4?

Not exactly an officially projected date, but in the past IIRC beta/RC 
has lasted 2 to 3 months, so I'd start looking for a 7.4 release in October.

> Also, is there a published roadmap, or should I just get on the developers 
> list?

The closest thing is the TODO list:  http://developer.postgresql.org/todo.php

But if you want to closely monitor the work actually getting done, 
subscribe to the HACKERS list.

Joe



Re: casting to arrays

From
Greg Stark
Date:
Joe Conway <mail@joeconway.com> writes:

> Not possible in current releases, but it will be in 7.4 (about to start beta).
> It looks like this:

Well there is the int_array_aggregate function in the contrib/intagg
directory. It has to be compiled separately, and it has a few quirks (like the
arrays are zero-based instead of 1-based) but it works more or less, and it
does exactly what you describe.

But the 7.4 stuff should be much cleaner and more flexible, so if you don't
need it right now you're better off waiting.

-- 
greg