2013-10-22 35 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;