我需要一种方法来测试给定数组中是否存在值。到目前为止,我想出了类似的东西
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
但我一直认为应该有一个更简单的方法,我只是看不到它。
编辑:刚刚意识到我可以做到这一点
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
这要好得多,我相信已经足够了,但如果你有其他方法可以做,请分享。
答案 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
也可以使用。
它将数组扩展为一组行,然后只需检查值是否存在就像使用IN
或NOT IN
一样简单。
e.g。
id =&gt; UUID
exception_list_ids =&gt; UUID []
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)
我只是猜测额外的强制转换是必需的,因为解析不需要获取表定义来确定列的确切类型。其他人请对此发表评论。