检查是否在Postgres的数组存在价值检查是否在Postgres的数组存在价值(Check if

2019-06-14 07:36发布

我需要一种方法来测试,如果给定的数组中存在的值。 到目前为止,我想出了这样的事情

select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)

但我一直在想应该有这样一个简单的方法,我只是不能看到它。

编辑:刚刚意识到我能做到这一点

select '{1,2,3}'::int[] @> ARRAY[value_variable::int]

这是好多了,我相信就足够了,但如果你有其他的方式来做到这一点,请分享。

Answer 1:

简单与ANY结构 :

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

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

  • SQLAlchemy的:如何在PgArray列类型过滤器?

重要的区别: 数组运算符( <@ @>等人)期望数组类型作为操作数和支撑GIN或GiST索引中的PostgreSQL标准分布,而ANY构建期望的元素类型作为左操作数,并且不支持这些指标。 例:

  • 索引用于在JSON阵列找到一个元件

这一切都不适用于NULL元素。 为了测试NULL

  • 检查NULL在Postgres的数组存在


Answer 2:

当心我钻进了陷阱:当检查是否一定值中不存在的数组,你不应该这样做:

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

但使用

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

代替。



Answer 3:

但如果你有其他的方式来做到这一点,请分享。

您可以比较两个数组。 如果任何左数组中的值的右侧阵列中重叠的值,则它返回真。 这是一种hackish的,但它的作品。

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


Answer 4:

unnest也可被使用。 它扩大阵列以一组行的,然后简单地检查值存在与否是如使用简单INNOT IN

  1. ID => UUID

  2. exception_list_ids => UUID []

select * from table where id NOT IN (select unnest(exception_list_ids) from table2)



Answer 5:

当寻找阵列的元件的存在,适当的铸造才能通过的Postgres SQL分析器。 下面是一个使用数组一个例子查询包含联接子句中操作:

为了简单起见,我只列出相关的部分:

table1 other_name text[]; -- is an array of text

显示SQL连接的一部分

from table1 t1 join table2 t2 on t1.other_name::text[] @> ARRAY[t2.panel::text]

以下也适用

on t2.panel = ANY(t1.other_name)

我只是猜测,因为解析不必取表定义计算列的确切类型的额外铸造是必需的。 其他请对此有何评论。



文章来源: Check if value exists in Postgres array