use*_*808 78 arrays postgresql
我正在使用Postgres的本机数组类型,并尝试查找ID不在数组收件人ID中的记录.
我可以找到他们在哪里IN:
SELECT COUNT(*) FROM messages WHERE (3 = ANY (recipient_ids))
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
SELECT COUNT(*) FROM messages WHERE (3 != ANY (recipient_ids))
SELECT COUNT(*) FROM messages WHERE (3 = NOT ANY (recipient_ids))
Run Code Online (Sandbox Code Playgroud)
测试这种情况的正确方法是什么?
Fra*_*mer 110
SELECT COUNT(*) FROM "messages" WHERE NOT (3 = ANY (recipient_ids))
Run Code Online (Sandbox Code Playgroud)
你总是可以否定WHERE (condition)
与WHERE NOT (condition)
mu *_*ort 36
你可以把它转过来说"3不等于所有ID":
where 3 != all (recipient_ids)
Run Code Online (Sandbox Code Playgroud)
从精细手册:
9.21.4.ALL(数组)
Run Code Online (Sandbox Code Playgroud)expression operator ALL (array expression)
右侧是带括号的表达式,它必须产生一个数组值.计算左侧表达式并使用给定运算符与数组的每个元素进行比较,这必须产生布尔结果.
ALL
如果所有比较都为真(包括数组中零元素的情况),则结果为"true".如果发现任何错误结果,结果为"假".
Tho*_*asH 13
ALL/ANY
答案我更喜欢使用all
或any
达到结果的所有解决方案,感谢其他注释(例如,关于NULL的注释)。作为另一个补充,这是一种考虑这些运算符的方法。
您可以将它们视为短路算子:
all(array)
遍历数组中的所有值,并使用提供的运算符将每个值与参考值进行比较。比较产生后false
,该过程以false结束,否则为true。(相当于短路逻辑and
。)any(array)
遍历数组中的所有值,并使用提供的运算符将每个值与参考值进行比较。比较产生后true
,该过程以true结束,否则以false结束。(相当于短路逻辑or
。)这就是为什么3 <> any('{1,2,3}')
未产生预期结果的原因:对于不平等,该过程将3与1进行比较,这是正确的,并立即返回true。数组中不同于3的单个值足以使整个条件成立。最后一个数组位置中的3是prob。没用过。
3 <> all('{1,2,3}')
另一方面,要确保所有值都不相等。3将对所有产生true的比较进行运算,直到产生出false的元素(在本例中为最后一个)返回总结果为false的元素。这就是OP想要的。
两者ALL
:
(some_value != ALL(some_array))
Run Code Online (Sandbox Code Playgroud)
和ANY
:
NOT (some_value = ANY(some_array))
Run Code Online (Sandbox Code Playgroud)
只要some_array
不为null,就可以使用。如果数组可能为空,则必须使用Coalesce()进行解释,例如
(some_value != ALL(coalesce(some_array, array[]::int[])))
Run Code Online (Sandbox Code Playgroud)
要么
NOT (some_value = ANY(coalesce(some_array, array[]::int[])))
Run Code Online (Sandbox Code Playgroud)
从文档:
如果数组表达式产生一个空数组,则ANY的结果将为空
如果数组表达式产生一个空数组,则ALL的结果将为空
归档时间: |
|
查看次数: |
61639 次 |
最近记录: |