检查Postgres数组中是否存在值

使用Postgres 9.0,我需要一种方法来测试给定数组中是否存在一个值。到目前为止,我想出了这样的东西:

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

但我一直在想应该有更简单的方法,我就是不明白。这个似乎更好:

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

我相信这就足够了。但如果你有其他的方法,请分享!

374044 次浏览

使用ANY结构更简单:

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

ANY的右操作数(括号之间)可以是set(例如,子查询的结果)< >强数组< / >强。有几种方法可以使用它:

重要的的区别:数组操作符(__ABC0, __ABC1, &&等)期望数组类型作为操作数,而在PostgreSQL的标准分布中,支持GIN或GiST指数类型作为操作数,而ANY构造期望元素类型作为左操作数,并且不支持这些索引。例子:

这些都不适用于NULL元素。测试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

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)

在数组中查找元素是否存在时,需要适当的强制转换来传递postgres的SQL解析器。下面是一个在join子句中使用数组包含操作符的示例查询:

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

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)

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

嗨,这个对我来说很好,也许对别人有用

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

“Any"工作得很好。只要确保any关键字在等号的右边,即出现在等号之后。

下面的语句将抛出错误:语法错误在&;any&;

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

而下面的例子很好

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