X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.2]) by svr1.postgresql.org (Postfix) with ESMTP id 005A9D1B568 for ; Sun, 2 Nov 2003 04:04:45 +0000 (GMT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (neptune.hub.org [200.46.204.2]) (amavisd-new, port 10024) with ESMTP id 61478-08 for ; Sun, 2 Nov 2003 00:04:13 -0400 (AST) Received: from heisenberg.zen.co.uk (heisenberg.zen.co.uk [212.23.8.70]) by svr1.postgresql.org (Postfix) with ESMTP id CCD71D1B535 for ; Sun, 2 Nov 2003 00:04:12 -0400 (AST) Received: from scotus.zen.co.uk ([212.23.8.20] helo=localhost) by heisenberg.zen.co.uk with smtp (Exim 4.22) id 1AG9TH-0002YR-6i for pgsql-sql@postgresql.org; Sun, 02 Nov 2003 04:04:11 +0000 To: Subject: Re: conditional query? From: Date: Sun, 2 Nov 2003 04:04:11 GMT Reply-To: X-Priority: 3 (Normal) X-Originating-Ip: [212.240.36.94] X-Mailer: NOCC v0.9.5 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit Message-Id: X-Originating-Heisenberg-IP: [212.23.8.20] X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200311/4 X-Sequence-Number: 15819 As you say, it is easiest if there is only one level of 'parenting'..! SELECT p.id, CASE WHEN p.UseParentAddress = 'Y' THEN (SELECT address FROM profile WHERE id = p.parentid) ELSE address AS address FROM Profile p If you do have multiple levels, you'll need to recurse, either with a cursor or a while loop - it might make sense to build a temporary table of all profiles for which you need addresses, and then loop around it until they are all filled in (or similar). Cheers, Matt Mlunnon @ RWA wrote : > Try something like > > SELECT p2.* > FROM profile p1, profile p2 > WHERE ( p1.id =1 AND useParenAddres = 'N' AND p2.id = p1.id ) > OR ( p1.id =1 AND useParenAddres = 'Y' AND p2.id = p1.parentId) > > Obviously this won't work if you have more than one level of parent > hood, i.e. it would pick up a grand parent.  If this is the case then > there is some kind of tree walking functionality in Postgres but I > don't know how portable this is or whether it will solve your problem. > > Another way to solve the grand parent thing would be to define a > recursive function. > > Happy coding. > > Cheers > Matthew > > > Achilleus Mantzios wrote: > > Why dont you try a combination of > CASE WHEN ... THEN ... ELSE ... END construct > along with a LEFT OUTER join (in case parentId is null). > > Not sure how "portable" the above will be. > > O kyrios Frank Morton egrapse stis Oct 31, 2003 : > > > > I have a table called a "profile" that has company addresses as well > as individual contact information. Simpifying: > > id (the primary key) > parentId (any profile can have a parent ie, contact parent is a company) > address (for this example, will just have one piece of the address) > useParentAddress > > If "useParentAddress"=="Y", that means that the parent address of this > person should really be used for mailings. If == "N" then the address > with that profile is the right one to use. > > Is there any way to do a single select to get a single "address" back > that is the right one depending on the value of "useParentAddress" > field? > > Also want to make this sql as portable as possible. > > Will appreciate any ideas. > > > ---------------------------(end of broadcast)--------------------------- > TIP 7: don't forget to increase your free space map settings --Matt