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];