Arrays Postgres不在数组中

Arrays Postgres不在数组中,arrays,postgresql,Arrays,Postgresql,我正在使用Postgres的本机数组类型,并尝试查找ID不在数组收件人ID中的记录 我可以找到他们的位置: 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_i

我正在使用Postgres的本机数组类型,并尝试查找ID不在数组收件人ID中的记录

我可以找到他们的位置:

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))
对于这种情况,正确的测试方法是什么

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

您始终可以使用
WHERE NOT(condition)
来否定
WHERE(condition)
NOT(3=任何收件人ID))

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

从:

9.21.4。全部(阵列)

右边是一个带括号的表达式,它必须生成一个数组值。使用给定的运算符计算左侧表达式,并将其与数组的每个元素进行比较,该运算符必须产生布尔结果。如果所有比较结果均为真(包括数组中有零个元素的情况),则
ALL
的结果为“真”。如果发现任何错误结果,则结果为“错误”


请注意,ANY/ALL运算符将不会处理数组索引。如果考虑到索引:

从“邮件”中选择计数(*),其中有3个收件人ID&&U
消极方面:

从“邮件”中选择COUNT(*),其中不包括(3个收件人ID&&U)
然后可以创建一个索引,如下所示:

使用GIN(收件人ID)在tableName上创建索引收件人ID
更新:

从研究生9.3开始

您也可以将
NOT
@>
结合使用来实现这一点

从非收件人ID@>数组[3]中的“邮件”中选择计数(*)

当心空值 两个
全部

(some_value != ALL(some_array))
任何

NOT (some_value = ANY(some_array))
只要
某些_数组
不为空,就可以工作。如果数组可能为null,则必须使用coalesce()对其进行解释,例如

从:

如果数组表达式生成一个空数组,则任何结果都将为空

如果数组表达式生成空数组,则ALL的结果将为空

增加
ALL/ANY
答案 我更喜欢使用
all
any
实现结果的所有解决方案,并欣赏附加注释(例如aboutNULLs)。作为另一种解释,这里是一种思考这些操作符的方法

您可以将其视为短路操作员:

  • all(array)
    遍历数组中的所有值,使用提供的运算符将每个值与参考值进行比较。一旦比较结果为
    false
    ,则该过程以false结束,否则为true。(与短路逻辑
    相当)
  • any(array)
    遍历数组中的所有值,使用提供的运算符将每个值与参考值进行比较。一旦比较结果为
    true
    ,则过程以true结束,否则为false。(与短路逻辑
    相当)
这就是为什么
3any({1,2,3}')
不能产生期望的结果的原因:该过程将3与1进行不等式比较,结果为真,并立即返回真。数组中一个不同于3的值足以使整个条件为真。最后一个数组位置中的3是prob。从未使用过


另一方面,确保所有值不等于3。它将运行所有的比较,从true到false(本例中的最后一个元素),以返回false作为整体结果。这就是OP想要的。

在收件人ID中不包含3的情况下
是否有效?相关说明:对于
text[]
int[]
array:
选择NOT(array[1,2,3]@>array[3])
Pro提示:如果您要检查数组中是否包含
null
列,它总是会说不。我花了20分钟调试了几个包含方法,得出结论,您无法检查数组中是否包含null,我使用的是
3 ANY(数组[1,2,3,4])
。它应该是这样工作的:\n与其他答案不同,此答案实际上使用了PostgreSQL数组重叠运算符<代码>&
这将无法按编写的方式工作。像&&和@>这样的数组运算符要求两个元素都是数组,而3不是。为了使其工作,需要将查询编写为:
SELECT COUNT(*)FROM“messages”WHERE ARRAY[3]&&recipient\u id
@aschyiel——随着
收件人id
输入列表的增长,您可能希望切换回
ANY
,而不是
中的
:这并不能真正解释
ANY
在这种情况下不起作用的原因。这应该被接受,因为它正确地解释了原因。PS你也可以在postgres doc上找到
any
all
,上面写着:“
xany(a,b,c)
相当于
xa或b或xc
”。裁判:
(some_value != ALL(some_array))
NOT (some_value = ANY(some_array))
(some_value != ALL(coalesce(some_array, array[]::int[])))
NOT (some_value = ANY(coalesce(some_array, array[]::int[])))