Postgresql

為什麼 NOT IN 與包含 NULL 的集合總是返回 FALSE/NULL?

  • May 4, 2012

我有一個查詢(針對 Postgres 和 Informix),其中NOT IN包含一個子查詢,在某些情況下該子查詢返回NULL值,導致該子句(以及整個查詢)無法返回任何內容。

理解這一點的最佳方法是什麼?我認為NULL是沒有值的東西,因此不希望查詢失敗,但顯然這不是正確的思考方式NULL

布爾邏輯 - 或三值邏輯

  • 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相同。 在評估表達式時,未知 原因請參見下面的@kgrittn 評論false``WHERE

引用自:https://dba.stackexchange.com/questions/17407