2013-10-22 116 views
0

这里有个人和地址表。有些人可能有地址或没有地址。如果他们有地址,则希望加入地址表,否则无需加入。请帮助解决此案例。如何与Where条款中的案例进行比较

select p.name,nvl(a.address,'address not available') from person p,address a 
where p.id = 2 and case 
      when p.addid is not null 
       then p.addid = a.id 
      else 0=0 end 
+3

如何使用peron p左连接地址a on pa ddid = a.id – eggward

+0

感谢您的所有帮助和解答。 – sunleo

回答

5

一般溶液 - 使用布尔逻辑。您无法在使用CASE的完整表达式之间进行选择,因此您应该将其重写为使用AND和OR的组合。从你的问题用的逻辑,你把它改写为:

WHERE p.id = 2 
AND 
(
    (p.addid IS NOT NULL AND p.addid = a.id) 
    OR (p.addid IS NULL AND 0=0) 
) 

最终简化了下来:

WHERE p.id = 2 
AND (p.addid IS NULL OR p.addid = a.id) 

您所查询的的具体的解决方案 - 用更好的JOIN语法,并简单地使用左连接:

SELECT p.name, nvl(a.address,'address not available') 
FROM person p 
LEFT OUTER JOIN address a ON p.addid = a.id 
WHERE p.id = 2 
1

您不能使用的情况下,但你可以实现与or含砂的组合相同的效果and小号

select p.name, 
     nvl(a.address,'address not available') 
    from person p, 
     address a 
where p.id = 2 and 
     (p.addid is not null AND p.addid = a.id 
     OR 
     p.addid is null 
     )   
2

尝试使用COALESCE功能如下

select p.name,nvl(a.address,'address not available') from person p,address a 
where p.id = 2 
and coalesce(p.addid,a.id)=a.id 
2
select p.name, nvl(a.address, 'address not available') 
from person p left outer join address a 
    on (p.addid = a.id) 
where p.id = 2; 
1

试试这个:

select p.name,nvl(a.address,'address not available') from person p,address a 
where p.id = 2 and a.id = case when p.addid is not null then p.addid else a.id end;