没有单个操作员可以检查两者(包含或不重叠)。
不在 Postgres 13 中,不在任何标准 Postgres 发行版中。
但是您可以轻松创建自己的运算符。我选择了<@!&&
明确的操作员名称,因为它不会与任何现有的操作员发生冲突。选择你喜欢的,也许更短一些,因为你的目标是短代码。
CREATE FUNCTION f_array_contained_or_no_overlap(anyarray, anyarray)
RETURNS boolean
LANGUAGE sql IMMUTABLE AS
'SELECT $1 <@ $2 OR NOT $1 && $2';
CREATE OPERATOR <@!&& (
FUNCTION = f_array_contained_or_no_overlap
, LEFTARG = anyarray
, RIGHTARG = anyarray
);
那么你就可以:
SELECT ARRAY[1,2] <@!&& ARRAY[1,2,7] AS contained -- true
, ARRAY[1,2] <@!&& ARRAY[4,5,6] AS no_overlap -- true
, ARRAY[1,2] <@!&& ARRAY[4,2,6] AS part_overlap; -- false
db<>在这里摆弄
实现您声明的简短代码的目标。
适用于任何数组(任何元素类型),但当然,两个操作数必须兼容。
但 ...
不允许 NULL 元素,因为底层的泛型数组运算符也不允许。
不能使用任何索引。看:
如果你直接使用底层函数f_array_contained_or_no_overlap(anyarray, anyarray)
而不是操作符,Postgres 应该可以内联它,这样一个适用的 GIN 索引仍然可以使用。
如果都是整数数组,则可以使用附加模块intarray
(也没有内置运算符)来实现更快的实现。