0

这里有人员和地址表。有些人可能有地址或没有地址。如果他们有地址,那么想加入地址表,否则不需要加入。请帮助解决这个问题。

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   
4

5 回答 5

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 语法,并简单地利用 LEFT 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
于 2013-10-22T07:59:26.993 回答
2

尝试使用合并功能如下

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
于 2013-10-22T08:02:40.750 回答
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;
于 2013-10-22T08:04:21.223 回答
1

不能用case,但是可以用ors和ands的组合达到同样的效果

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
       )        
于 2013-10-22T08:01:13.263 回答
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;   
于 2013-10-22T08:29:21.183 回答