web-dev-qa-db-ja.com

NULLを含むセットでNOT INが常にFALSE / NULLを返すのはなぜですか?

クエリ(PostgresおよびInformix用)に、サブクエリを含むNOT IN句が含まれていて、場合によってはNULL値が返され、その句(およびクエリ全体)が何も返さなかった。

これを理解する最良の方法は何ですか?私はNULLを値のないものと考えたため、クエリが失敗することを期待していませんでしたが、明らかにNULLを正しく考える方法ではありません。

21
newenglander

ブール論理-または 値論理

  • INは、一連のOR条件の省略形です。
  • x NOT IN (1, 2, NULL)NOT (x = 1 OR x = 2 OR x = NULL)と同じです
  • ...はx <> 1 AND x <> 2 AND x <> NULLと同じです
  • ...はtrue AND true AND unknownと同じ**
  • ... = unknown **
  • ... false条件を渡さないため、この場合はWHEREとほぼ同じです**

これが、人々がEXISTS + NOT EXISTSではなくIN + NOT INを使用する理由です。詳細は インデックスに関連するNOTロジックの使用 も参照してください

**注:unknownは、false条件の式の最後のWHEREと同じです。
式が評価されている間、それは不明です
理由については、以下の@kgrittnのコメントを参照してください

29
gbn