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:
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)
代替.
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)
1位于右侧数组中true,即使该值4未包含在右侧数组中,第二个查询也是如此4)中没有值在右侧数组中,因此返回false“任何”效果都很好。只需确保 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)
嗨,一个对我来说很好用,也许对某人有用
select * from your_table where array_column ::text ilike ANY (ARRAY['%text_to_search%'::text]);
Run Code Online (Sandbox Code Playgroud)
unnest也可以使用。它将数组扩展为一组行,然后简单地检查一个值是否存在就像使用INor一样简单NOT IN。
例如
id => uuid
exception_list_ids => uuid[]
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
| 归档时间: |
|
| 查看次数: |
199297 次 |
| 最近记录: |