知識に基づいた推測(詳細情報が不足しているため):
NOT IN (...)
NULL
を返します NULL
がある場合 値が含まれており、テストされた値はリストにありません。ただし、TRUE
のみ WHERE
の資格 条項。
a NOT IN (b,c)
に変換されます:
a <> ALL ('{b,c}'::sometype[])
同等:
(a <> b AND a <> c )
いずれかの場合 これらの値の(演算子のいずれかの側にある)はNULL
です 、次のようになります:
(NULL AND FALSE)
それは:
NULL
そしてNULL
FALSE
と同等です WHERE
句。 TRUE
のみ 資格があります。
これは、3値論理に慣れていないユーザーに不信感を与えることが知られています。
IS DISTINCT FROM
を使用します またはNOT EXISTS
代わりは。またはLEFT JOIN / IS NULL
。
例(より当て推量)
この特定のケースでは、罪を犯した表現はまったく必要ありません
SELECT ta.task_id AS id
, u.employee_id
, ta.task_status_type_id
FROM task_assignments ta
JOIN users u ON u.id = ta.user_id
WHERE ta.id IN (
SELECT max(ta.id) AS id
FROM task_details td
JOIN task_assignments ta USING (task_id)
WHERE td.developer_employee_id IS NULL
AND ta.task_type_id IN (6,7)
-- AND ta.task_status_type_id IS DISTINCT FROM 10 -- just cruft
AND ta.task_status_type_id = 9 -- this expression covers it
GROUP BY ta.task_id
)
包含リストと要素を共有する可能性のある除外する値のリストを密かに使用している場合:
...
AND (ta.task_status_type_id IN ( ... )) IS NOT TRUE
...
または、NULL値を削除します。
または、包含リストと除外リストに共通の要素を避けます。