如何执行 SQL 左连接,首先尝试在一个列上匹配,但如果第一次匹配失败,则在不同的列上匹配?

问题描述 投票:0回答:1

我有两个表想要加入,但遇到了问题。我相信一定有一种方法可以干净地完成此操作,但我的菜鸟 SQL 技能还不够。以下是这两个表的详细信息:

Two hypothetical tables

这是我希望从 SQL 查询返回的输出: the desired results of combining the two tables

所以基本上我想要的是我需要从最喜欢的食物表(表1)中拉出所有的人,并使用名称匹配将他们与表2中的电子邮件/电话号码进行匹配,如果不匹配工作,然后查找他们的 ID,然后提取电子邮件/电话。

在 Excel 中,通过执行几个包含在“IFNA”中的 VLOOKUPS 来解决该问题,基本上首先在名称匹配上尝试一次 Vlookup,如果失败,则对 ID 执行 VLookup。在两者之间,我可以匹配几乎所有数据。这在 SQL 中是如何实现的呢?我的数据集对于 Excel 来说太大了。

我解决这个问题的伪代码尝试/思考过程(显然不是工作代码)如下:

select * from People  LEFT JOIN Contacts ON People.Name == Contacts.Name,  if Null, then LEFT JOIN Contacts ON People.ID == Contacts.ID

sql left-join case amazon-athena
1个回答
0
投票

您可以从人员表离开连接到联系人表两次,每次可能与姓名或 ID 匹配一次:

SELECT
    p.Name,
    p.ID,
    p.favorite_food,
    COALESCE(c1.email, c2.email) AS email,
    COALESCE(c1.phone, c2.phone) AS phone
FROM people p
LEFT JOIN contacts c1
    ON c1.Name = p.Name
LEFT JOIN contact c2
    ON c2.ID = p.ID;
© www.soinside.com 2019 - 2024. All rights reserved.