Postgresql 中文操作指南

9.19. Array Functions and Operators #

Table 9.53 显示了可用于数组类型的特殊运算符。除了那些运算符之外, Table 9.1 中显示的通常比较运算符也可用于数组。比较运算符逐个元素比较数组内容,使用元素数据类型的默认 B 树比较函数,然后根据第一个差异进行分类。在多维数组中,按行优先顺序访问元素(最后一个下标变化最快)。如果两个数组的内容相等,但维度不同,则维度信息中的第一个差异决定了分类顺序。

Table 9.53. Array Operators

Operator

Description

Example(s)

anyarray @> anyarrayboolean 第一个数组是否包含第二个数组,即第二个数组中出现的每个元素是否等于第一个数组的某个元素?(不特殊地对待重复项,因此 ARRAY[1]ARRAY[1,1] 都被视为包含对方。) ARRAY[1,4,3] @> ARRAY[3,1,3]t

anyarray <@ anyarrayboolean 第一个数组是否包含在第二个数组中? ARRAY[2,2,7] <@ ARRAY[1,7,4,2,6]t

anyarray && anyarrayboolean 数组是否重叠,即有任何共同的元素? ARRAY[1,4,3] && ARRAY[2,1]t

anycompatiblearray _

_ anycompatiblearrayanycompatiblearray 连接两个数组。连接一个空数组或一个空数组时,什么也不执行;否则,这些数组的维数必须相同(第一个示例中已说明),或者维数相差一(第二个示例中已说明)。如果这些数组的元素类型不相同,则强制转换为公共类型(请参阅 Section 10.5 )。_ARRAY[1,2,3]

ARRAY[4,5,6,7]_ → {1,2,3,4,5,6,7}

_ARRAY[1,2,3]

ARRAY[[4,5,6],[7,8,9.9]]_ → {{1,2,3},{4,5,6},{7,8,9.9}}

anycompatible _

_ anycompatiblearrayanycompatiblearray 连接一个元素到一个数组的开头(该数组必须为空或一维)。_3

ARRAY[4,5,6]_ → {3,4,5,6}

anycompatiblearray _

_ anycompatibleanycompatiblearray 连接一个元素到一个数组的末尾(该数组必须为空或一维)。_ARRAY[4,5,6]

7_ → {4,5,6,7}

请参阅 Section 8.15 以了解有关数组运算符的行为的更多详细信息。请参阅 Section 11.2 以了解有关支持索引运算的运算符的更多详细信息。

Table 9.54 中显示了可用于数组类型的函数。请参阅 Section 8.15 以了解有关这些函数的用法以及示例的更多信息。

Table 9.54. Array Functions

Function

Description

Example(s)

array_append ( anycompatiblearray , anycompatible ) → anycompatiblearray 向数组的末尾附加一个元素(与 anycompatiblearray _

_ anycompatible 运算符相同)。 array_append(ARRAY[1,2], 3){1,2,3}

array_cat ( anycompatiblearray , anycompatiblearray ) → anycompatiblearray 连接两个数组(与 anycompatiblearray _

_ anycompatiblearray 运算符相同)。 array_cat(ARRAY[1,2,3], ARRAY[4,5]){1,2,3,4,5}

array_dims ( anyarray ) → text 返回该数组的维度的文本表示形式。 array_dims(ARRAY[[1,2,3], [4,5,6]])[1:2][1:3]

array_fill ( anyelement , integer[] [, integer[] ] ) → anyarray 返回一个数组,其中填充了给定值的副本,并且维度为第二个参数指定长度。可选的第三个参数为每个维度提供较低边界值(它们默认均为 1 )。 array_fill(11, ARRAY[2,3]){{11,11,11},{11,11,11}} array_fill(7, ARRAY[3], ARRAY[2])[2:4]={7,7,7}

array_length ( anyarray , integer ) → integer 返回请求数组维度的长度。(对于空或缺失的维度,会产生 NULL,而不是 0。) array_length(array[1,2,3], 1)3 array_length(array[]::int[], 1)NULL array_length(array['text'], 2)NULL

array_lower ( anyarray , integer ) → integer 返回请求维度数组的下界。 array_lower('[0:2]={1,2,3}'::integer[], 1)0

array_ndims ( anyarray ) → integer 返回数组的维度数。 array_ndims(ARRAY[[1,2,3], [4,5,6]])2

array_position ( anycompatiblearray , anycompatible [, integer ] ) → integer 返回第二个参数在数组中的首次出现的下标,如果不存在,则返回 NULL 。如果给出了第三个参数,则从该下标开始搜索。数组必须是一维的。比较使用 IS NOT DISTINCT FROM 语义完成,因此可以搜索 NULLarray_position(ARRAY['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'], 'mon')2

array_positions ( anycompatiblearray , anycompatible ) → integer[] 返回数组中第二个参数所有出现的下标数组,第一个参数作为第一个参数提供。数组必须是一维的。比较使用 IS NOT DISTINCT FROM 语义完成,因此可以搜索 NULLNULL 仅在数组为 NULL 时返回;如果在数组中未找到该值,则返回一个空数组。 array_positions(ARRAY['A','A','B','A'], 'A'){1,2,4}

array_prepend ( anycompatible , anycompatiblearray ) → anycompatiblearray 将一个元素添加在数组的开头(与 anycompatible _

_ anycompatiblearray 运算符相同)。 array_prepend(1, ARRAY[2,3]){1,2,3}

array_remove ( anycompatiblearray , anycompatible ) → anycompatiblearray 从数组中删除所有等于给定值的所有元素。数组必须是一维的。比较使用 IS NOT DISTINCT FROM 语义完成,因此可以删除 NULLarray_remove(ARRAY[1,2,3,2], 2){1,3}

array_replace ( anycompatiblearray , anycompatible , anycompatible ) → anycompatiblearray 将等于第二个参数的每个数组元素替换为第三个参数。 array_replace(ARRAY[1,2,5,4], 5, 3){1,2,3,4}

array_sample ( array anyarray , n integer ) → anyarray 返回一个数组,其中 n 为从 array 中随机选择的项目。 n 可能不会超过 array 的第一个维度的长度。如果 array 是多维的,“项目”则是一个切片,具有给定的第一个下标。 array_sample(ARRAY[1,2,3,4,5,6], 3){2,6,1} array_sample(ARRAY[[1,2],[3,4],[5,6]], 2){{5,6},{1,2}}

array_shuffle ( anyarray ) → anyarray 随机打乱数组的第一维。 array_shuffle(ARRAY[[1,2],[3,4],[5,6]]){{5,6},{1,2},{3,4}}

array_to_string ( array anyarray , delimiter text [, null_string text ] ) → text 将每个数组元素转换为其文本表示,并以 delimiter 字符串分隔的方式连接这些元素。如果给定 null_string 且其不为 NULL ,那么 NULL 数组条目将由该字符串表示;否则,将忽略这些条目。另请参阅 string_to_arrayarray_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '')1,2,3,,5

array_upper ( anyarray , integer ) → integer 返回所请求的数组维度上限。 array_upper(ARRAY[1,8,3,7], 1)4

cardinality ( anyarray ) → integer 返回数组中的元素总数,如果数组为空则返回 0。 cardinality(ARRAY[[1,2],[3,4]])4

trim_array ( array anyarray , n integer ) → anyarray 通过移除最后 n 个元素来裁剪数组。如果数组是多维的,则只裁剪第一维。 trim_array(ARRAY[1,2,3,4,5,6], 2){1,2,3,4}

unnest ( anyarray ) → setof anyelement 将数组展开到一组行中。按照存储顺序读出数组的元素。 unnest(ARRAY[1,2]) → 1 2 unnest(ARRAY[['foo','bar'],['baz','quux']]) → foo bar baz quux

unnest ( anyarray , anyarray [, …​ ] ) → setof anyelement, anyelement [, …​ ] 将多个数组(可能是不同数据类型的数组)展开到一组行中。如果数组长度不全相同,则较短的数组将用 NULL 填充。此形式仅允许在查询的 FROM 子句中使用;请参阅 Section 7.2.1.4select * from unnest(ARRAY[1,2], ARRAY['foo','bar','baz']) as x(a,b) → a

b ---+----- 1

foo 2

bar

baz

另请参阅 Section 9.21关于与数组一起使用的聚合函数_array_agg_。