【问题标题】:NOT IN in postgresql not working [closed]不在postgresql中不工作[关闭]
【发布时间】:2013-10-22 12:27:49
【问题描述】:

我没有得到预期的输出,因为

 AND ta.task_status_type_id 不在 (10)

在下面的查询中不起作用。

选择 ta.task_id AS id, u.employee_id ASemployee_id, ta.task_status_type_id 从 task_assignments AS ta, 用户作为你 在哪里 u.id = ta.user_id 和 ta.id IN ( 选择 max ( ta.id ) OVER ( partition BY ta.task_id ) AS id 从 task_details AS td, task_assignments AS ta 在哪里 td.task_id = ta.task_id 并且 td.developer_employee_id 为空 AND ta.task_type_id IN(6,7) AND ta.task_status_type_id 不在(10) AND ta.task_status_type_id IN (9) );

请帮助解决错误。

【问题讨论】:

  • 你为什么不直接说AND ta.task_status_type_id = 9? “不工作”是什么意思?
  • task_assignments.task_status_type_id的数据类型是什么?可以是NULL吗?
  • 它适用于我:select 9 not in (10) 返回 true。
  • 可以简化查询吗? 10 你的意思是一些子查询的结果?我 100% 确定这在 PostgreSQL 中不起作用。 sqlfiddle.com/#!12/8c9b6/1
  • As always:请提供 Postgres 版本、表定义、预期结果、错误消息。

标签: sql postgresql notin


【解决方案1】:

有根据的猜测(由于缺乏更多信息):

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 相当于WHERE 子句中的FALSE。只有TRUE 符合条件。

众所周知,这会导致不熟悉 tri-valued logic 的用户不相信。

请改用IS DISTINCT FROMNOT 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 值。
或者您避免包含和排除列表中的常见元素。

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 1970-01-01
    • 2013-02-04
    • 2014-05-04
    • 2016-04-26
    • 2012-10-08
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多