2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

9.19. 数组函数和运算符 #

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

表 9.54. 数组运算符

运算符

描述

示例

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.55 显示了可用于数组类型的函数。有关这些函数的用法及其示例,请参见第 8.15 节

表 9.55. 数组函数

函数

描述

示例

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在数组中的用法。

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。