SQL Server JOIN 缺少 NULL 值

新手上路,请多包涵

假设我有以下 2 个表:

       Table1:                                Table2:
Col1:      Col2:     Col3:             Col1:       Col2:       Col4:
a          b         c                 a           b           d
e          <null>    f                 e           <null>      g
h          i         j                 h           i           k
l          <null>    m                 l           <null>      n
o          <null>    p                 o           <null>      q

现在,我想在 Col1Col2 上加入这些表,然后将整个集合恢复为:

      Result:
Col1:      Col2:     Col3:     Col4:
a          b         c         d
e          <null>    f         g
h          i         j         k
l          <null>    m         n
o          <null>    p         q

所以,我尝试了一个类似的 SQL:

 SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1
INNER JOIN Table2
    ON Table1.Col1 = Table2.Col1
    AND Table1.Col2 = Table2.Col2

但它与 NULL 中的值不匹配 Col2 ,所以我最终得到:

      Result:
Col1:      Col2:     Col3:     Col4:
a          b         c         d
h          i         j         k

我怎样才能得到我正在寻找的结果?

谢谢!

原文由 John Bustos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 494
2 个回答

您可以明确说明连接:

 SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN
     Table2
      ON (Table1.Col1 = Table2.Col1 or Table1.Col1 is NULL and Table2.Col1 is NULL) AND
         (Table1.Col2 = Table2.Col2 or Table1.Col2 is NULL and Table2.Col2 is NULL)

在实践中,我更有可能在连接条件中使用 coalesce()

 SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN
     Table2
     ON (coalesce(Table1.Col1, '') = coalesce(Table2.Col1, '')) AND
        (coalesce(Table1.Col2, '') = coalesce(Table2.Col2, ''))

其中 '' 将是两个表中都不存在的值。

只是一个警告。在大多数数据库中,使用这些结构中的任何一个都会阻止使用索引。

原文由 Gordon Linoff 发布,翻译遵循 CC BY-SA 3.0 许可协议

一些 SQL 实现有一个特殊的 Null 安全相等运算符。

例如雪花有 EQUAL_NULL 所以你可以做

SELECT
  Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM
  Table1
  INNER JOIN Table2 ON EQUAL_NULL(Table1.Col1, Table2.Col1)
  AND EQUAL_NULL(Table1.Col2, Table2.Col2)

原文由 Fabich 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进