Sql Where子句中如何与Case进行比较

Sql Where子句中如何与Case进行比较,sql,oracle,Sql,Oracle,这里有个人和地址表。有些人可能有地址或没有地址。如果他们有地址,然后想加入地址表,否则就不需要加入。请帮助解决这个问题 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 els

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

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   
一般解决方案-使用布尔逻辑。您不能在使用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)

查询的特定解决方案-使用更好的联接语法,只需利用左联接:

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

您不能使用用例,但是您可以通过组合
s和
s来实现相同的效果

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
       )        

尝试使用下面的合并功能

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
试试这个:

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;   

使用p.addid=a.id上的peron p left join address a如何谢谢您的帮助和回答。
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;