PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

NOT IN in postgresql funktioniert nicht

Eine fundierte Vermutung (mangels weiterer Informationen):

NOT IN (...) gibt NULL zurück falls vorhanden NULL Werte beteiligt sind und der getestete Wert nicht in der Liste enthalten ist. Aber nur TRUE qualifiziert sich in einem WHERE Klausel.

a NOT IN (b,c)

wird umgewandelt in:

a <> ALL ('{b,c}'::sometype[])

Äquivalent zu:

(a <> b AND a <> c )

Falls irgendwelche dieser Werte (auf beiden Seiten des Operators) ist NULL , erhalten Sie:

(NULL AND FALSE)

Das ist:

NULL

Und NULL entspricht FALSE in einem WHERE Klausel. Nur TRUE qualifiziert.

Es ist bekannt, dass dies bei Benutzern, die mit dreiwertiger Logik nicht vertraut sind, Unglauben hervorruft.

Verwenden Sie IS DISTINCT FROM oder NOT EXISTS stattdessen. Oder LEFT JOIN / IS NULL .

Beispiel (mehr Vermutungen)

In diesem speziellen Fall brauchen Sie den inkriminierten Ausdruck überhaupt nicht

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
   )

Wenn Sie heimlich eine Liste von auszuschließenden Werten verwenden, die Elemente mit der Einschlussliste teilen könnten:

... 
    AND    (ta.task_status_type_id IN ( ... )) IS NOT TRUE
...

Oder Sie sortieren NULL-Werte aus.
Oder Sie vermeiden gemeinsame Elemente in Ein- und Ausschlusslisten.