使用Postgres 9.0,我需要一种方法来测试给定数组中是否存在一个值。到目前为止,我想出了这样的东西:
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
但我一直在想应该有更简单的方法,我就是不明白。这个似乎更好:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
我相信这就足够了。但如果你有其他的方法,请分享!
使用Postgres 9.0,我需要一种方法来测试给定数组中是否存在一个值。到目前为止,我想出了这样的东西:
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的右操作数(括号之间)可以是一个集合(例如子查询的结果)或一个数组。有几种方法可以使用它:
如何过滤PgArray列类型? IN与PostgreSQL中的ANY运算符
重要区别:数组操作符(<@,@>,&&等)期望数组类型作为操作数,并在PostgreSQL的标准分布中支持GIN或GiST索引,而ANY构造期望元素类型作为左操作数,并且可以用普通b树索引支持(将索引表达式放在操作符的左边,而不是像你的例子中那样相反)。例子:
用于在JSON数组中查找元素的索引
这些都不适用于NULL元素。要测试NULL:
检查Postgres数组中是否存在NULL
其他回答
ANY结构更简单:
SELECT value_variable = ANY ('{1,2,3}'::int[])
ANY的右操作数(括号之间)可以是一个集合(例如子查询的结果)或一个数组。有几种方法可以使用它:
如何过滤PgArray列类型? IN与PostgreSQL中的ANY运算符
重要区别:数组操作符(<@,@>,&&等)期望数组类型作为操作数,并在PostgreSQL的标准分布中支持GIN或GiST索引,而ANY构造期望元素类型作为左操作数,并且可以用普通b树索引支持(将索引表达式放在操作符的左边,而不是像你的例子中那样相反)。例子:
用于在JSON数组中查找元素的索引
这些都不适用于NULL元素。要测试NULL:
检查Postgres数组中是否存在NULL
小心我陷入的陷阱:当检查某个值是否不存在于数组中时,你不应该这样做:
SELECT value_variable != ANY('{1,2,3}'::int[])
但是使用
SELECT value_variable != ALL('{1,2,3}'::int[])
代替。
但如果你有其他的方法,请分享。
你可以比较两个数组。如果左边数组中的任何值与右边数组中的值重叠,则返回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
“Any”很好。只要确保any关键字在等号的右边,即出现在等号之后。
下面的语句将抛出错误:
select 1 where any('{hello}'::text[]) = 'hello';
而下面的例子很好
select 1 where 'hello' = any('{hello}'::text[]);
Unnest也可以使用。 它将数组扩展为一组行,然后简单地检查一个值是否存在,就像使用IN或not IN一样简单。
如。
Id => uuid Exception_list_ids => uuid[]
select (exception (list_ids)) from table2