我想执行类似的操作
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
答案 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 Linoff的solution。
答案 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)