Postgres不在数组中

我正在使用Postgres的本地数组types,并试图查找ID不在数组收件人ID中的logging。

我可以find他们在哪里:

SELECT COUNT(*) FROM "messages" WHERE (3 = ANY (recipient_ids)) 

但是这不起作用:

 SELECT COUNT(*) FROM "messages" WHERE (3 != ANY (recipient_ids)) SELECT COUNT(*) FROM "messages" WHERE (3 = NOT ANY (recipient_ids)) 

什么是正确的方式来testing这种情况?

 SELECT COUNT(*) FROM "messages" WHERE NOT (3 = ANY (recipient_ids)) 

你可以总是否定WHERE (condition)WHERE NOT (condition)

你可以把它转过来,说“3不等于所有的ID”:

 where 3 != all (recipient_ids) 

从精美的手册 :

9.21.4。 ALL(arrays)

 expression operator ALL (array expression) 

右侧是一个带括号的expression式,它必须产生一个数组值。 使用给定的运算符评估左侧expression式并与数组的每个元素进行比较,该运算符必须产生布尔结果。 如果所有的比较都为真(包括数组中没有元素的情况),那么ALL的结果是“真”的。 如果发现任何错误的结果,结果是“假”。

not (3 = any(recipient_ids))

请注意,ANY / ALL操作符不能使用数组索引。 如果记住索引:

 SELECT COUNT(*) FROM "messages" WHERE 3 && recipient_ids 

和否定的:

 SELECT COUNT(*) FROM "messages" WHERE NOT (3 && recipient_ids) 

然后可以创build一个索引,如下所示:

 CREATE INDEX recipient_ids_idx on tableName USING GIN(recipient_ids) 

更新:

截至postgres 9.3,

你可以使用NOT@> (包含运算符)一起来实现这一点。

IE浏览器。

SELECT COUNT(*) FROM "messages" WHERE NOT recipient_ids @> ARRAY[3];