PostgreSQL intarray数组相减时的去重行为是否为预期?
PostgreSQL intarray模块数组减法的重复元素处理:这是预期行为
这个行为是完全符合intarray模块设计逻辑的,具体差异原因如下:
int[] - integer操作:
这个操作是针对数组元素的逐个匹配移除,只会删除所有等于目标整数的元素,而保留其他元素的重复项。比如你给出的例子:SELECT '{3,1,1,2,2,2}'::int[] - 1; -- 返回 {3,2,2,2}这里所有值为1的元素被移除,但2的重复实例全部保留,它不是集合操作,而是元素级的过滤逻辑。
int[] - int[]操作:
这个操作属于集合意义上的差集运算,intarray模块会把参与运算的数组当作无序集合处理:首先自动去重,再计算两个集合的差集,最终返回的结果也是去重且排序后的数组。比如你的例子:SELECT '{3,1,1,2,2,2}'::int[] - '{1}'::int[]; -- 返回 {2,3}原数组被当作集合{1,2,3},减去集合{1}后得到{2,3},这是集合差集的标准行为。
截至PostgreSQL 16版本,官方文档确实未明确提及这一差异,但PostgreSQL开发团队已经提议更新文档,补充说明intarray模块中这类集合操作的去重特性,进一步确认了该行为是预期设计。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

