我正在使用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[])
<@
,@>
,&&
等)期望操作数为数组类型,并且在PostgreSQL的标准发行版中支持GIN或GiST索引,而ANY
结构则期望左操作数为元素类型,可以使用普通的B-tree索引进行支持(索引表达式位于运算符的左侧,而不是像您的示例中看起来的那样在另一侧)。 例如:
所有这些都无法处理NULL
元素。 要测试NULL
:
当你想要检查一个数组中是否没有某个特定的值时,请注意陷阱:不要这样做:
SELECT value_variable != ANY('{1,2,3}'::int[])
但使用
SELECT value_variable != ALL('{1,2,3}'::int[])
相反。
SELECT NOT value_variable = ANY('{1,2,3}'::int[])
可能更易读。 - Ondřej Bouda但是如果您有其他方法,请分享。
您可以将两个数组进行比较。如果左侧数组中的任何值与右侧数组中的值重叠,则返回 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
可以被使用来展开数组并转换为一组行,然后检查一个值是否存在就像使用 IN
或 NOT IN
一样简单。
例如:
id => uuid
exception_list_ids => uuid[]
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
嗨,那个对我来说很好用,也许对其他人有用。
select * from your_table where array_column ::text ilike ANY (ARRAY['%text_to_search%'::text]);
select 1 where any('{hello}'::text[]) = 'hello';
以下示例可以正常工作:
select 1 where 'hello' = any('{hello}'::text[]);
在查找数组中的元素时,需要进行适当的类型转换以通过Postgres的SQL解析器。以下是使用包含数组操作符的连接子句中的一个示例查询:
为了简单起见,我仅列出相关部分:
table1 other_name text[]; -- is an array of text
from table1 t1 join table2 t2 on t1.other_name::text[] @> ARRAY[t2.panel::text]
on t2.panel = ANY(t1.other_name)
对于@ErwinBrandstetter的已接受答案,还有一个额外的注意事项:如果您想在与单个值进行比较时利用数组列上的索引,可以像这样将值包装在数组中:
select '{1,2,3}'::int[] @> ARRAY[value_variable]
但是,在使用参数时可能需要转换数组类型:
select '{1,2,3}'::int[] @> ARRAY[@value_variable]::int[]
<@
运算符,两侧都必须是一个数组:ARRAY[s.employee_id] <@ '+list_of_employeeIDs+'::int[]
数组语法示例。 - Erwin Brandstetter'something' = ANY(some_array)
。出于某些原因,只有Crom知道,我过去四年一直以为不能在WHERE子句中使用数组比较器。但现在那些日子已经过去了。(或许只是我小时候被摔了一下头,所以才会这么想)。 - GT.boolean
表达式都可以使用——取决于Crom是否愿意。 - Erwin BrandstetterSELECT id FROM conversation WHERE 45043182 = ANY(participant_user_ids) ;
- oligofren