带有'ANY'的PostgreSQL查询无效

时间:2012-05-20 13:59:08

标签: arrays postgresql

SELECT "Ticket_id"  FROM "Tickets"
 WHERE "Status" = 1 AND ("Ticket_id" !=  ANY(array[1,2,3])) Limit 6

结果是1,2,3,4,5,6

2 个答案:

答案 0 :(得分:64)

您想使用ALL,而不是ANY。来自fine manual

  

<强> 9.21.3。 ANY / SOME(数组)

expression operator ANY (array expression)
     

[...]使用给定的 运算符 计算左侧表达式并与数组的每个元素进行比较,这必须产生布尔结果。如果获得任何真实结果,ANY的结果为“真”。

所以,如果我们这样说:

1 != any(array[1,2])

然后,由于(1 != 1) or (1 != 2)为真,我们才会成真。 ANY本质上是OR运营商。例如:

=> select id from (values (1),(2),(3)) as t(id) where id != any(array[1,2]);
 id 
----
  1
  2
  3
(3 rows)

如果我们查看ALL, we see

  

<强> 9.21.4。 ALL(数组)

expression operator ALL (array expression)
     

[...]使用给定的 运算符 计算左侧表达式并与数组的每个元素进行比较,这必须产生布尔结果。如果所有比较都是真的,则ALL的结果为“真”......

所以,如果我们这样说:

1 != all(array[1,2])

然后我们会因为(1 != 1) and (1 != 2)为false而得到错误,我们发现ALL本质上是一个AND运算符。例如:

=> select id from (values (1),(2),(3)) as t(id) where id != all(array[1,2]);
 id 
----
  3
(1 row)

如果要排除数组中的所有值,请使用ALL

select "Ticket_id"
from "Tickets"
where "Status" = 1
  and "Ticket_id" != all(array[1,2,3])
limit 6

答案 1 :(得分:6)

你的意思是:

"Ticked_id" NOT IN (1,2,3)