Re: "Join" on delimeter aggregate query - Mailing list pgsql-sql

From Michael A Nachbaur
Subject Re: "Join" on delimeter aggregate query
Date
Msg-id 200306091308.48367.mike@nachbaur.com
Whole thread Raw
In response to Re: "Join" on delimeter aggregate query  (Eivind Kvedalen <eivindkv@ifi.uio.no>)
List pgsql-sql
Thanks very much, this helps immensely.  I've worked with functions before, 
but never aggregates.  I guess there's some more bedtime reading for me to 
look into now.

Re: sorting, this is not important to me, but I will keep the issues brought 
up by Tom Lane in mind when I use this.

On Saturday 07 June 2003 02:06 pm, Eivind Kvedalen wrote:
> Hi
>
> You can create an aggregate function to solve this. A friend of mine asked
> the same question a while ago, and I created a possible example solution
> for him, which I paste here:
>
> CREATE FUNCTION concat(varchar,varchar) RETURNS varchar
>      AS 'SELECT CASE
>            $1 WHEN \'\' THEN $2
>            ELSE $1 || \',\'|| $2
>          END AS RESULT;'
>      LANGUAGE SQL;
>
> /* DROP AGGREGATE concat(varchar); */
>
> CREATE AGGREGATE concat (
>   BASETYPE = varchar,
>   SFUNC = concat,
>   STYPE = varchar,
>   INITCOND = ''
> );
>
> /* Example code */
>
> DROP TABLE test;
> CREATE TABLE test (
>       a varchar,
>       b varchar
> );
>
> INSERT INTO test VALUES ('A', '1');
> INSERT INTO test VALUES ('A', '3');
> INSERT INTO test VALUES ('A', '2');
> INSERT INTO test VALUES ('B', 'a');
> INSERT INTO test VALUES ('C', 'b');
> INSERT INTO test VALUES ('C', 'c');
>
> SELECT a, concat(b) FROM (SELECT a,b FROM test ORDER BY a,b) T GROUP BY a;
>
> /*
>
>  a | concat
> ---+---------
>  A | 1,2,3
>  B | a
>  C | b,c
>
> */
>
> The ORDER BY is included to sort the rows before they are aggregated. I'm
> not sure that this guarantees that they actually will be sorted, but maybe
> some of the postgresql hackers can confirm/deny this? I guess this isn't
> important to you, though.
>
> On Fri, 6 Jun 2003, Michael A Nachbaur wrote:
> > Hello everyone,
> >
> > I've set up PostgreSQL as the authentication / configuration database for
> > my mail server (Postfix + Courier-IMAP), and though it works beautifully,
> > I need some help on my aliases query.
> >
> > You see, define aliases in a database table as rows in a column in the
> > form of "Source" and "Target".  The problem is that one source address
> > can be delivered to multiple targets (e.g. internal mailing list, or a
> > temporary forward to another address), but postfix only processes the
> > first record returned from an SQL query.
> >
> > Postfix can deliver to multiple targets, if you separate the targets with
> > comas, like so:
> >
> > Source             Target
> > joe@bob.org   address1@bob.org,address2@bob.org,....
> >
> > What I would like to do, is something like the following (I know I'd need
> > to group the query, but you get the idea):
> >
> > Select DISTINCT(Source), JOIN(Target, ',') FROM Aliases
> >
> > Is there any way this can be done with Postfix?
>
> Eivind

-- 
Michael A Nachbaur <mike@nachbaur.com>



pgsql-sql by date:

Previous
From: Forest Wilkinson
Date:
Subject: how to determine array size
Next
From: Rado Petrik
Date:
Subject: Retype