如何在有条件的情况下执行LEFT JOIN

时间:2020-10-01 10:52:03

标签: mysql sql

我想执行类似的操作

SELECT  g.Name, g.emailID, g.phoneNo
FROM roomAllocation as ra
// if ra.guest_email is NOT NULL
LEFT JOIN Guests as g ON ra.guest_email = g.emailid
// else
LEFT JOIN Guests as g ON ra.guestPhoneNo = g.PhoneNo

4 个答案:

答案 0 :(得分:4)

如果我理解正确,那么您想有条件地加入表。我会推荐两个left join,如下所示:

select t1.*,
       coalesce(ge.name, gp.name) as name
from table1 t1 left join
     table2 ge
     on t1.guest_email = ge.email_id left join
     table2 gp
     on t1.guest_phoneNo = gp.phoneNo and t1.guest_email is null;

由于它是同一张表,因此您还可以在or子句中使用on

select t1.*, g.*
from table1 t1 left join
     table2 g
     on t1.guest_email = geemail_id or
        (t1.guest_phoneNo = g.phoneNo and t1.guest_email is null);

但是,or子句中的on通常会降低性能。

答案 1 :(得分:2)

正式

LEFT JOIN Guests as g
     ON CASE WHEN table1.guest_email NOT NULL
             THEN table1.guest_email = table2.email_id
             ELSE table1.guest_phoneNo = table2.phoneNo
             END

但是这杀死了索引的使用。我建议使用Gordon Linoffsolution

答案 2 :(得分:1)

猜猜您可以使用UNION将其分为2个查询:

SELECT  g.Name, g.emailID, g.phoneNo   
FROM roomAllocation as ra 
LEFT JOIN Guests as g ON ra.guest_email = g.email_id  
UNION  
SELECT  g.Name, g.emailID, g.phoneNo   
FROM roomAllocation as ra 
LEFT JOIN Guests as g ON ra.guest_phoneNo = g.phoneNo  

如果两个结果重叠,则使用UNION将其合并。

答案 3 :(得分:1)

我相信这会起作用

 LEFT JOIN Guests as g
 ON (case when RA.guest_email IS NOT NULL 
 then RA.guest_email else RA.guest_phoneNo end) = (case when RA.guest_email IS NOT NULL then g.email_id else g.phoneNo end)