MySQL: COALESCE within JOIN



我一直在尝试使用 COALESCE 创建具有多种匹配形式的查询以连接两个表 - 但据我所知,它没有工作。

有人可以告诉我这个查询有什么问题吗?

SELECT *
FROM t1
LEFT JOIN t2 ON COALESCE(t1.id,t1.phone,t1.address) = COALESCE(t2.id,t2.phone,t2.address)

类似的东西。希望查询将首先查看t1t2中的唯一ID是否匹配,如果没有,则继续查看手机是否匹配,等等。尝试匹配多组条件并返回与任何列匹配的条件,并且仅在查询根本找不到匹配项时仅返回 t1 的 NULL,这将非常有帮助。


编辑:

通过"不起作用",我的意思是 ID 匹配似乎有效 - 如果唯一标识符匹配,它将从t2(而不是 NULL)返回数据,但它不会继续尝试匹配电话号码或地址行; 这显然可能是因为t1表没有返回任何 NULL 值。

该表的定义是,t1是可能位于较大t2表中的较小数据子集。假设t1是一个大约 100 人的表格,只有几个标准:姓名、电话、地址、ID(尽管 ID 并非每一行都存在)——而t2是一个更大的表格,大约有 30,000 人,有更多的标准(姓名、电话、地址、ID、工作、志愿者、电子邮件、笔记等),我试图在 30k 中找到 100 人。

我怀疑你想要这个:

SELECT *
FROM t1 LEFT JOIN
     t2
     ON t1.id = t2.id OR t1.phone = t2.phone or t1.address = t2.address;

如果任何键匹配,这将匹配两行。 但是,您可能需要:

SELECT *
FROM t1 LEFT JOIN
     t2
     ON (t1.id = t2.id) OR
        ((t1.id is null or t2.id is null) AND t1.phone = t2.phone) or
        (((t1.id is null or t2.id is null) and (t1.phone is null or t2.phone is null)) and t1.address = t2.address
        )

查询失败可能有多种原因。 一种可能性是类型不兼容。 另一个是不同的行具有不同的NULL值分布,因此您最终会比较不同的列,例如 t1.idt2.address .

最新更新