我需要一种方法来测试,如果给定的数组中存在的值。 到目前为止,我想出了这样的事情
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
但我一直在想应该有这样一个简单的方法,我只是不能看到它。
编辑:刚刚意识到我能做到这一点
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
这是好多了,我相信就足够了,但如果你有其他的方式来做到这一点,请分享。
简单与ANY
结构 :
SELECT value_variable = ANY ('{1,2,3}'::int[])
的右操作数ANY
(括号之间)可以是一个组(子查询的结果,例如) 或 阵列 。 有几种方法来使用它:
- SQLAlchemy的:如何在PgArray列类型过滤器?
重要的区别: 数组运算符( <@
@>
等人)期望数组类型作为操作数和支撑GIN或GiST索引中的PostgreSQL标准分布,而ANY
构建期望的元素类型作为左操作数,并且不支持这些指标。 例:
这一切都不适用于NULL
元素。 为了测试NULL
:
当心我钻进了陷阱:当检查是否一定值中不存在的数组,你不应该这样做:
SELECT value_variable != ANY('{1,2,3}'::int[])
但使用
SELECT value_variable != ALL('{1,2,3}'::int[])
代替。
但如果你有其他的方式来做到这一点,请分享。
您可以比较两个数组。 如果任何左数组中的值的右侧阵列中重叠的值,则它返回真。 这是一种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
unnest
也可被使用。 它扩大阵列以一组行的,然后简单地检查值存在与否是如使用简单IN
或NOT IN
。
如
ID => UUID
exception_list_ids => UUID []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
当寻找阵列的元件的存在,适当的铸造才能通过的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)
我只是猜测,因为解析不必取表定义计算列的确切类型的额外铸造是必需的。 其他请对此有何评论。