Postgresql
為什麼 NOT IN 與包含 NULL 的集合總是返回 FALSE/NULL?
我有一個查詢(針對 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