为了账号安全,请及时绑定邮箱和手机立即绑定

检查Postgres数组中是否存在值

检查Postgres数组中是否存在值

我需要一种方法来测试给定数组中是否存在值。到目前为止,我想到了这样的东西select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)但我一直认为应该有一个更简单的方法,我只是看不到它。编辑:刚意识到我可以做到这一点select '{1,2,3}'::int[] @> ARRAY[value_variable::int]这要好得多,我相信就足够了,但是如果您有其他方法可以做到,请分享。
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

使用ANY构造更简单:


SELECT value_variable = ANY ('{1,2,3}'::int[])

的右操作数ANY(括号之间)可以是一个组(子查询的结果,例如) 或一个阵列。有几种使用方法:


SQLAlchemy:如何筛选PgArray列类型?

重要区别:数组运算符(<@,@>等)将数组类型期望为操作数,并在PostgreSQL的标准发行版中支持GIN或GiST索引,而该ANY构造将元素类型期望为左操作数,并且不支持这些索引。例:


用于在JSON数组中查找元素的索引

这些都不适合NULL元素。测试NULL:


检查Postgres数组中是否存在NULL


查看完整回答
反对 回复 2019-11-26
?
FFIVE

TA贡献1797条经验 获得超6个赞

当心我陷入的陷阱:当检查数组中是否不存在某些值时,您不应该这样做:


SELECT value_variable != ANY('{1,2,3}'::int[])

但是使用


SELECT value_variable != ALL('{1,2,3}'::int[])

代替。


查看完整回答
反对 回复 2019-11-26
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

但是,如果您还有其他方法可以分享,请与我们分享。


您可以比较两个数组。如果左侧数组中的任何值与右侧数组中的值重叠,则它将返回true。这有点骇人听闻,但确实有效。


SELECT '{1}'   && '{1,2,3}'::int[];  -- true

SELECT '{1,4}' && '{1,2,3}'::int[];  -- true

SELECT '{4}'   && '{1,2,3}'::int[];  -- false

在第一个和第二个查询中,值1在正确的数组中

请注意,第二个查询是true,即使该值4未包含在正确的数组中

对于第三个查询,左数组(即4)中没有值在右数组中,因此它返回false


查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 2871 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信