mysql - 你如何基于一列连接两个表,除非它为空,在这种情况下,基于两个不同的列连接

标签 mysql sql join

所以这很令人困惑,但让我们从下表开始:

 Table1           Table2
 ID1  |  ID2  ||  ID1  |  ID2
 -----------  ||  -----------
 jve  |  234  ||  jve  |  null
 null |  234  ||  dav  |  234
 rev  |  584  ||  rev  |  null
 null |  584  ||  ewj  |  584
 avv  |  442  ||  avv  |  null
 null |  442  ||  pol  |  442

*表格的组织是为了便于理解,但实际上并非如此

我想做的是在 T1.ID1 = T2.ID1 上加入 Table1 和 Table2。但是,如果 ID1 恰好为 null,那么我想在 T1.ID2 = T2.ID2 而不是第一种方式上加入它们。

我用谷歌搜索得到的是

SELECT *
  FROM table1 t1
       INNER JOIN table2 t2
          ON (    t1.ID1 = COALESCE (t2.ID1, t1.ID1)
              AND t1.ID2 = COALESCE (t2.ID2, t1.ID2))
 WHERE ID2 = '234';

我想要弹出的结果只是水平合并上面的表格:

Results
-------
jve  | 234 | jve | null
null | 234 | dav | 234
etc..

这样做的原因是除了 ID2 之外还有更多的列,我试图在表 1 和表 2 之间对齐。

这里的主要问题是我不确定如何表达逻辑,

if( T1.ID1 == null )
{
   ON T1.ID2 = T2.ID2
}
else
{
   ON T1.ID1 = T2.ID1
}

进入SQL

如果需要更多信息,我很乐意添加到我的帖子中。

我忘了包括如果它加入第一种方式,它不应该之后加入第二种方式。我的意思是,第一行,jve | 234应该加入jve | null 然后是下一行,null |应该抢234而不是加入jve | 234 到 dav | 234...如果这有意义的话..

我需要这两个表使用一种或另一种方法连接,但不能同时使用这两种方法。

最佳答案

您的逻辑听起来像是 ON 子句中的 OR 条件:

SELECT *
FROM table1 t1 INNER JOIN
     table2 t2
     ON t1.ID1 = t2.ID1 OR
        (t1.ID1 IS NULL AND t1.ID2 = t2.ID2)
WHERE t1.ID2 = '234';

关于mysql - 你如何基于一列连接两个表,除非它为空,在这种情况下,基于两个不同的列连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34006985/

相关文章:

mysql - 如何强制 mySQL 在 WHERE 比较中不将 varchar 转换为数字

php - 如何使用 PHP 获取活跃用户列表?

mysql - 如何从两个数据库查询数据并按范围对结果进行分组

mysql - 如果连接字段有值则执行连接

php - 按日期顺序连接两个表并显示结果

mysql - 将 curdate() 与基于另一个表的时间连接起来

java - 读取数据库后在 Java 中捕获异常的正确方法

phpmyadmin 导出到 csv for excel

sql - 使用 SQL 生成日期范围

mysql - 在单个查询中从交联表中获取数据集