1. ホーム
  2. sql

[解決済み] SQL Server の JOIN で NULL 値が見つからない

2023-04-19 15:41:22

質問

以下の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

どうしたら求めている結果が得られるのでしょうか?

ありがとうございます。

どのように解決するのですか?

結合を明示的にすることができます。

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, ''))

ここで '' はどちらのテーブルにもない値です。

ただ、注意しなければならないことがあります。 ほとんどのデータベースでは、これらの構成のいずれかを使用すると、インデックスが使用できなくなります。