检查Postgres数组中是否存在值

时间:2012-06-27 17:07:41

标签: arrays postgresql postgresql-9.0

我需要一种方法来测试给定数组中是否存在值。到目前为止,我想出了类似的东西

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

但我一直认为应该有一个更简单的方法,我只是看不到它。

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

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

这要好得多,我相信已经足够了,但如果你有其他方法可以做,请分享。

7 个答案:

答案 0 :(得分:253)

使用ANY construct更简单:

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

ANY(括号之间)的右操作数可以是set (result of a subquery, for instance) array。有几种方法可以使用它:

重要差异:Array operators (<@, @> et al.)期望数组类型为PostgreSQL的标准发行版中的操作数和support GIN or GiST indices,而ANY construct期望元素类型为左操作数,并且不支持这些索引。例如:

这些都不适用于NULL个元素。要测试NULL

答案 1 :(得分:68)

注意我遇到的陷阱:当检查数组中是否存在某个值时,你不应该这样做:

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

但请使用

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

代替。

答案 2 :(得分:21)

  

但如果你有其他方法可以做,请分享。

您可以比较两个阵列。如果左数组中的任何值与右数组中的值重叠,则返回true。这是一种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

答案 3 :(得分:2)

嗨,对我来说很好,也许对某人有用

select * from your_table where array_column ::text ilike ANY (ARRAY['%text_to_search%'::text]);

答案 4 :(得分:1)

unnest 也可以使用。 它将数组扩展为一组行,然后只需检查值是否存在就像使用INNOT IN一样简单。

e.g。

  1. id =&gt; UUID

  2. exception_list_ids =&gt; UUID []

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

答案 5 :(得分:1)

“任何”都可以正常工作。只要确保any关键字在等号的右侧,即在等号后出现。

下面的语句将引发错误:错误:“任何”或附近的语法错误

select 1 where any('{hello}'::text[]) = 'hello';

下面的例子很好用

select 1 where 'hello' = any('{hello}'::text[]);

答案 6 :(得分:0)

在查找数组中元素的存在时,需要正确的转换才能传递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)

我只是猜测额外的强制转换是必需的,因为解析不需要获取表定义来确定列的确切类型。其他人请对此发表评论。