sql >> データベース >  >> RDS >> PostgreSQL

postgresqlでNOTINが機能しない

    知識に基づいた推測(詳細情報が不足しているため):

    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値を削除します。
    または、包含リストと除外リストに共通の要素を避けます。




    1. SQLデータベーステーブルのポリモーフィズム?

    2. LIKE演算子がMySQLでどのように機能するか

    3. SQL-varcharデータ型を日時データ型に変換した結果、値が範囲外になりました

    4. Oracleでマイナス/プラス記号を使用して数値をフォーマットする方法