MW211 EXIT

devlog
SQL/完全外部結合でNULL比較
2014年11月08日
「FULL JOIN」で完全外部結合し、NULLも含めた比較をしたい場合。
「NULL = NULL」では「真」にならないという障壁がある。

つまり、以下のような感じになり、「ギ」の部分が「真」でないという誤算がある。

【一致比較の場合】    【不一致比較の場合】
┌─┬─┬─┬─┐    ┌─┬─┬─┬─┐
│  │a│b│ヌ│    │  │a│b│ヌ│
├─┼─┼─┼─┤    ├─┼─┼─┼─┤
│a│真│偽│偽│    │a│偽│真│ギ│
├─┼─┼─┼─┤    ├─┼─┼─┼─┤
│b│偽│真│偽│    │b│真│偽│ギ│
├─┼─┼─┼─┤    ├─┼─┼─┼─┤
│ヌ│偽│偽│ギ│    │ヌ│ギ│ギ│偽│
└─┴─┴─┴─┘    └─┴─┴─┴─┘

ということで、「ギ」を「真」にするSQL文は以下のようになる。

【一致比較の場合】
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM [表1]                                                              │
│        FULL JOIN [表2]                                                     │
│          ON [表1].[キー] = [表2].[キー]                                    │
│    WHERE [表1].[列] = [表2].[列]                                           │
│       OR (([表1].[列] IS NULL) AND ([表2].[列] IS NULL));                  │
└──────────────────────────────────────┘

【不一致比較の場合】
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM [表1]                                                              │
│        FULL JOIN [表2]                                                     │
│          ON [表1].[キー] = [表2].[キー]                                    │
│    WHERE [表1].[列] <> [表2].[列]                                          │
│       OR (([表1].[列] IS     NULL) AND ([表2].[列] IS NOT NULL))           │
│       OR (([表1].[列] IS NOT NULL) AND ([表2].[列] IS     NULL));          │
└──────────────────────────────────────┘

もっと簡単な方法がありそうな気もするが、原始的な方法であれば上記の通りとなる。
分類:SQL