PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

NOT IN no postgresql não está funcionando


Um palpite (por falta de mais informações):

NOT IN (...) retorna NULL se houver NULL valores estão envolvidos e o valor testado não está na lista. Mas apenas TRUE qualifica em um WHERE cláusula.
a NOT IN (b,c)

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

equivalente a:
(a <> b AND a <> c )

Se qualquer desses valores (em ambos os lados do operador) é NULL , você obtém:
(NULL AND FALSE)

Isso é:
NULL

E NULL é equivalente a FALSE em um WHERE cláusula. Apenas TRUE qualifica.

Isso é conhecido por causar descrença em usuários não familiarizados com lógica de três valores.

Use IS DISTINCT FROM ou NOT EXISTS em vez de. Ou LEFT JOIN / IS NULL .

Exemplo (mais suposições)


Neste caso específico, você não precisa da expressão incriminada de forma alguma
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
   )

Se você estiver usando secretamente uma lista de valores a serem excluídos que podem compartilhar elementos com a lista de inclusão:
... 
    AND    (ta.task_status_type_id IN ( ... )) IS NOT TRUE
...

Ou você elimina valores NULL.
Ou você evita elementos comuns na lista de inclusão e exclusão.