Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

9.19. 数组函数和运算符 #

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

表 9.53 数组运算符

运算符

说明

示例

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

连接两个数组。连接空数组或 null 数组不会执行任何操作;否则,数组必须具有相同数量的维数(如第一个示例所示)或维数相差一(如第二个示例所示)。如果数组的元素类型不相同,则会将它们强制转换为公共类型(请参阅第 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}


有关数组运算符行为的更多详细信息,请参阅 第 8.15 节。有关哪些运算符支持索引操作的更多详细信息,请参阅 第 11.2 节

表 9.54 显示了可用于数组类型的函数。有关这些函数的使用情况的更多信息和示例,请参阅 第 8.15 节

表 9.54. 数组函数

函数

说明

示例

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 语义进行,因此可以搜索 NULL

array_position(ARRAY['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'], 'mon')2

array_positions ( anycompatiblearray, anycompatible ) → integer[]

返回一个数组,其中包含作为第一个参数提供的数组中所有第二个参数出现位置的脚标。数组必须是一维的。比较使用 IS NOT DISTINCT FROM 语义,因此可以搜索 NULL。仅当数组为 NULL 时才返回 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 语义,因此可以删除 NULL

array_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

array 中随机选取 n 个项目返回一个数组。 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_array

array_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 子句中使用;请参见 第 7.2.1.4 节

select * from unnest(ARRAY[1,2], ARRAY['foo','bar','baz']) as x(a,b)

 a |  b
---+-----
 1 | foo
 2 | bar
   | baz

另请参见 第 9.21 节,了解用于数组的聚合函数 array_agg