Обсуждение: conditional query?

Поиск
Список
Период
Сортировка

conditional query?

От
Frank Morton
Дата:
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.



Re: conditional query?

От
Achilleus Mantzios
Дата:
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
> 

-- 
-Achilleus



Re: conditional query?

От
"mlunnon @ RWA"
Дата:
Try something like<br /><br /> SELECT p2.* <br /> FROM profile p1, profile p2 <br /> WHERE ( p1.id =1 AND
useParenAddres= 'N' AND p2.id = p1.id ) <br /> OR ( p1.id =1 AND useParenAddres = 'Y' AND p2.id = p1.parentId) <br
/><br/> 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
portablethis is or whether it will solve your problem.<br /><br /> Another way to solve the grand parent thing would be
todefine a recursive function.<br /><br /> Happy coding.<br /><br /> Cheers<br /> Matthew<br /><br /><br /> Achilleus
Mantzioswrote:<br /><blockquote cite="midPine.LNX.4.44.0310311544270.13725-100000@matrix.gatewaynet.com"
type="cite"><prewrap="">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 :
 </pre><blockquote type="cite"><pre wrap="">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
   </pre></blockquote><pre wrap=""> </pre></blockquote>

Re: conditional query?

От
Дата:
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
builda 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 <mlunnon@rwa-net.co.uk> 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