Re: Denormalizing during select - Mailing list pgsql-sql

From Josh Berkus
Subject Re: Denormalizing during select
Date
Msg-id 200302251024.19249.josh@agliodbs.com
Whole thread Raw
In response to Re: Denormalizing during select  (Jeff Boes <jboes@nexcerpt.com>)
List pgsql-sql
Jeff,

> > I have two tables (A and B) in a one-to-many relationship. When
> > retrieving data from one table (A), I need to denormalize the tables
> > during a select so that values of a column in the many table (B) appear
> > as a list in one field of the output.
>
> Well, the straightforward way to do this would be with a function:

Actually, it's much easier to do this using a custom aggregate:

CREATE FUNCTION "comma_cat" (text,text) RETURNS text AS '
SELECT CASE WHEN $2 IS NULL OR $2 = '''' THEN $1WHEN $1 IS NULL OR $1 = '''' THEN $2ELSE $1 || '', '' || $2END
' LANGUAGE 'sql';


CREATE AGGREGATE comma_list ( BASETYPE = text, SFUNC = comma_cat, STYPE =
text,
INITCOND = '' );

SELECT a.id, a.col1, a.col2, comma_list(b.text)
FROM a JOIN b on a.id = b.a_id
GROUP BY a.id, a.col1, a.col2

The only drawback of this approach is that you cannot order the items in the
list, but it is *much* faster than the function method that Jeff outlined.


--
-Josh BerkusAglio Database SolutionsSan Francisco



pgsql-sql by date:

Previous
From: Rod Taylor
Date:
Subject: Re: Relation "pg_relcheck"
Next
From: Roberto Mello
Date:
Subject: Return type of triger functions from OPAQUE to TRIGGER in 7.3