检查Postgres数组中是否存在值

Mik*_*rov 169 arrays postgresql postgresql-9.0

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

select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Run Code Online (Sandbox Code Playgroud)

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

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

select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 290

ANY构造更简单:

SELECT value_variable = ANY ('{1,2,3}'::int[])
Run Code Online (Sandbox Code Playgroud)

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

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

这些都不适用于NULL元素.测试NULL:

  • @GT.:它的要点:*任何*“布尔”表达式都可以在“WHERE”子句中工作 - Crom 愿意。 (3认同)
  • 如果您无法将其解读为普通的 SQL 查询,请参阅以下示例:`SELECT id FROM对话 WHERE 45043182 = ANY(participant_user_ids) ;` (3认同)
  • 尽管这是互联网时代的一个恐龙问题,但应该让像我这样的缓慢人士知道“'something'= ANY(some_array)`”也可以在“ WHERE”子句中使用。由于仅Crom知道的原因,最近四年来我一直在考虑不能在WHERE子句中使用数组比较器。那些日子已经过去了。(我小时候掉在头上,所以也许就是我)。 (2认同)

mur*_*son 78

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

SELECT value_variable != ANY('{1,2,3}'::int[])
Run Code Online (Sandbox Code Playgroud)

但是用

SELECT value_variable != ALL('{1,2,3}'::int[])
Run Code Online (Sandbox Code Playgroud)

代替.

  • `SELECT NOT value_variable = ANY('{1,2,3}':: int [])`可能更具可读性 (39认同)
  • 一种双重否定; 注意他对'ALL` vs`ANY`的使用 (2认同)

vol*_*ron 26

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

您可以比较两个阵列.如果左数组中的任何值与右数组中的值重叠,则返回true.这有点像hackish,但它确实有效.

SELECT '{1}'   && '{1,2,3}'::int[];  -- true
SELECT '{1,4}' && '{1,2,3}'::int[];  -- true
SELECT '{4}'   && '{1,2,3}'::int[];  -- false
Run Code Online (Sandbox Code Playgroud)
  • 在第一个和第二个查询中,value 1位于右侧数组中
  • 请注意true,即使该值4未包含在右侧数组中,第二个查询也是如此
  • 对于第三个查询,左数组(即4)中没有值在右侧数组中,因此返回false


Deb*_*tra 9

“任何”效果都很好。只需确保 any 关键字位于等号右侧,即出现在等号之后。

下面的语句将抛出错误:错误:“any”处或附近的语法错误

select 1 where any('{hello}'::text[]) = 'hello';
Run Code Online (Sandbox Code Playgroud)

而下面的例子工作正常

select 1 where 'hello' = any('{hello}'::text[]);
Run Code Online (Sandbox Code Playgroud)


Dav*_*czo 6

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

select * from your_table where array_column ::text ilike ANY (ARRAY['%text_to_search%'::text]);
Run Code Online (Sandbox Code Playgroud)


pg2*_*286 5

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

例如

  1. id => uuid

  2. exception_list_ids => uuid[]

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


归档时间:

查看次数:

199297 次

最近记录:

8 年,6 月 前