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;