使用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]
我相信这就足够了。但是如果你有其他的方法,请分享!
7条答案
按热度按时间ymzxtsji1#
使用**
ANY
**构造时更简单:ANY
的右操作数(在括号中)可以是set(例如,子查询的结果)或array。有几种方法可以使用它:重要差异:数组运算符(
<@
、@>
、&&
等)在PostgreSQL的标准分发中期望 array 类型作为操作数,期望support GIN or GiST indices,而ANY
构造期望 element 类型作为左操作数,并且可以通过普通B树索引来支持(索引表达式位于运算符的 * 左侧 *,而不是像示例中那样相反)。示例:这些都不适用于
NULL
元素。l0oc07j22#
小心我掉进的陷阱:当检查某个值是否不存在于数组中时,不应执行以下操作:
而是使用了
而不是。
mwecs4sa3#
但是如果你有其他的方法,请分享。
你可以比较两个数组,如果左边数组中的值和右边数组中的值重叠,那么它返回true,这有点像黑客,但是它是有效的。
1
位于右侧数组中true
,尽管值4
未包含在右侧数组中4
),右数组中没有值,因此它返回false
w1jd8yoj4#
也可以使用**
unnest
**,它将数组扩展为一组行,然后简单地检查一个值是否存在,就像使用IN
或NOT IN
一样简单。例如,在
1.标识符=〉通用标识符
1.异常列表标识=〉uuid[]
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
2ul0zpep5#
嗨,那个对我来说很好用,也许对某人有用
camsedfj6#
“Any”很好用。只要确保any关键字在等号的右边,即出现在等号之后。
以下语句将引发错误:错误:“any”或其附近有语法错误
而下面的示例工作正常
plupiseo7#
当查找数组中是否存在某个元素时,需要进行正确的转换才能通过postgres的SQL解析器。下面是一个在join子句中使用数组包含操作符的示例查询:
为简单起见,我只列出相关部分:
所示SQL的连接部分
下面的方法也有效
型
我只是猜测需要额外的强制转换,因为解析不必获取表定义来计算列的确切类型。