跳到主要内容

数组函数和操作符

PostgreSQL 数组保存同一元素类型的多个值。它适合小规模标签或计算输入,但需要逐个元素加约束、关联或频繁修改时,关联表更合适。

访问与形状​

SELECT (ARRAY['a', 'b', 'c'])[1]; -- a
SELECT array_length(ARRAY['a', 'b'], 1); -- 2
SELECT cardinality(ARRAY[]::integer[]); -- 0
SELECT array_dims(ARRAY[[1, 2], [3, 4]]); -- [1:2][1:2]

普通数组下标通常从 1 开始,但可以构造其他下界,不能永久假设任何数组都是 1 起始。array_length 指定维度;空数组上会返回 NULL,cardinality 返回元素总数(空数组是 0)。不存在的下标通常得到 NULL。

组合与判断​

SELECT ARRAY[1, 2] || ARRAY[3]; -- {1,2,3}
SELECT ARRAY[1, 2] @> ARRAY[2]; -- true:包含
SELECT ARRAY[1, 2] && ARRAY[2, 3]; -- true:有共同元素
SELECT 2 = ANY(ARRAY[1, 2, 3]); -- true

<@ 表示被包含;包含判断不把重复次数算进去,例如 [1] 与 [1,1] 在包含意义下可互相包含。= ANY(array) 类似“等于其中任意元素”;若没有匹配但数组含 NULL,结果可能为未知,空数组则为假。= ALL(array) 表示与每项都相等,空数组为真。

修改和展开​

SELECT array_append(ARRAY[1, 2], 3);
SELECT array_remove(ARRAY[1, NULL, 2], NULL); -- {1,2}
SELECT * FROM unnest(ARRAY['a', 'b']); -- 两行

array_position、array_positions 查找位置,array_agg 把多行聚合成数组;需要确定元素顺序时在聚合内写 ORDER BY。unnest 在 FROM 中展开,和原表联合时注意行数倍增。数组包含/重叠查询可考虑 GIN 索引,但需要结合数据规模验证。