因此,只有在填充了电子邮件字段的情况下,我才需要加入公司表。
如果有一个空的电子邮件字段,有没有办法排除公司表连接?
select * from person p left join company c on(substring_index(p.email, '@', -1)=c.website and p.email <> '')
我不能使用“where”子句来做到这一点,因为我正在加入另一个表,并且无论如何我都希望该表加入。
任何帮助将不胜感激,谢谢!
我想到了!灵感一闪而过,...
select * from person p left join company c on((case when length(p.email)>0 then substring_index(p.email,'@',-1) else "purplepower" end)=c.website)
通过使用“case”子句,我确保只有存在的电子邮件值匹配。如果不是,则它匹配一个当然与公司表不匹配的任意字符串。
这过于复杂,并且没有必要进行复杂的解决方法。从本质上讲, aLEFT JOIN
将尝试在您指定的列上加入另一个表,如果它无法加入它,则该表中的列是 NULL。此外,连接用于根据连接条件从多个表中返回列。由于您使用的是左连接,因此无论电子邮件值如何,您都将返回person表中的所有行。
由于您没有从公司中选择任何内容并使用左联接,因此您的变通解决方案查询与以下内容相同:
select * from person p
where p.email <> ''
根据您对工作中还有另一张桌子的评论,您可以强制公司具有价值:
select * from person p
left join company c on (
substring_index(p.email, '@', -1) = c.website
AND c.website <> '')
select * from (select * from person where email <> '') p
left join company c
on(substring_index(p.email, '@', -1)=c.website )