Postgresql中的NOT IN无法正常工作

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

 AND ta.task_status_type_id NOT IN(10)

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

选择

ta.task_id AS ID,

u.employee_id AS员工ID,

ta.task_status_type_id

task_assignments AS ta,

使用者AS u

在哪里

u.id = ta.user_id

AND 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

AND td.developer_employee_id为NULL

AND ta.task_type_id IN(6,7)

AND ta.task_status_type_id NOT IN(10)

AND ta.task_status_type_id IN(9)

);

请协助解决错误。

回答:

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

返回

如果任何NULL值都参与并测试值是不在列表中。但是仅TRUEWHERE子句中有条件。

a NOT IN (b,c)

转换为:

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

相当于:

(a <> b AND a <> c )

如果这些值中的 _ _ 一个(在运算符的任一侧)为NULL,则您将获得:

(NULL AND FALSE)

那是:

NULL

并且NULL等效FALSE于一个WHERE子句。仅TRUE符合条件。

众所周知,这会使不熟悉三值逻辑的用户难以置信。

使用IS DISTINCT

FROM或 代替。或者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值。

或者您避免在包含和排除列表中使用公共元素。

以上是 Postgresql中的NOT IN无法正常工作 的全部内容, 来源链接: utcz.com/qa/406647.html

回到顶部