9.18. 数组函数和运算符

Table 9.48显示可用于数组类型的运算符。

表 9.48. 数组运算符

OperatorDescriptionExampleResult
=equalARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3]t
<>not equalARRAY[1,2,3] <> ARRAY[1,2,4]t
<less thanARRAY[1,2,3] < ARRAY[1,2,4]t
>greater thanARRAY[1,4,3] > ARRAY[1,2,4]t
<=小于或等于ARRAY[1,2,3] <= ARRAY[1,2,3]t
>=大于或等于ARRAY[1,4,3] >= ARRAY[1,4,3]t
@>containsARRAY[1,4,3] @> ARRAY[3,1,3]t
<@包含在ARRAY[2,2,7] <@ ARRAY[1,7,4,2,6]t
&&重叠(具有相同的元素)ARRAY[1,4,3] && ARRAY[2,1]t
||array-to-array concatenationARRAY[1,2,3] || ARRAY[4,5,6]{1,2,3,4,5,6}
||array-to-array concatenationARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]]{{1,2,3},{4,5,6},{7,8,9}}
||element-to-array concatenation3 || ARRAY[4,5,6]{3,4,5,6}
||array-to-element concatenationARRAY[4,5,6] || 7{4,5,6,7}

数组排序运算符(<>=等)使用元素数据类型的默认 B 树比较功能逐个元素比较数组内容,并基于第一个差异进行排序。在多维数组中,元素以行优先 Sequences 访问(最后一个下标变化最快)。如果两个数组的内容相等,但维数不同,则维数信息中的第一个差异将确定排序 Sequences。 (这是对 8.2 之前的 PostgreSQL 版本的更改:较旧的版本会声称两个具有相同内容的数组是相等的,即使维数或下标范围的数量不同)。

如果数组包含运算符(<@@>)的每个元素都出现在另一个数组中,则该数组包含运算符认为一个数组包含在另一个数组中。没有对重复项进行特殊处理,因此ARRAY[1]ARRAY[1,1]都被视为包含另一个。

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

Table 9.49显示了可用于数组类型的功能。有关更多信息和这些功能的使用示例,请参见Section 8.15

表 9.49. 数组函数

FunctionReturn TypeDescriptionExampleResult
array_append(anyarray, anyelement)anyarray将元素附加到数组的末尾array_append(ARRAY[1,2], 3){1,2,3}
array_cat(anyarray, anyarray)anyarray连接两个数组array_cat(ARRAY[1,2,3], ARRAY[4,5]){1,2,3,4,5}
array_ndims(anyarray)int返回数组的维数array_ndims(ARRAY[[1,2,3], [4,5,6]])2
array_dims(anyarray)text返回数组尺寸的文本表示形式array_dims(ARRAY[[1,2,3], [4,5,6]])[1:2][1:3]
array_fill(anyelement, int[] [, int[]])anyarray返回一个使用提供的值和尺寸初始化的数组,还可以使用下限值(非 1)初始化array_fill(7, ARRAY[3], ARRAY[2])[2:4]={7,7,7}
array_length(anyarray, int)int返回所请求数组维的长度array_length(array[1,2,3], 1)3
array_lower(anyarray, int)int返回请求的数组维的下限array_lower('[0:2]={1,2,3}'::int[], 1)0
array_position(anyarray, anyelement [, int])int返回数组中第二个参数第一次出现的下标,从第三个参数指示的元素或第一个元素开始(数组必须是一维的)array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon')2
array_positions(anyarray, anyelement)int[]返回作为第一个参数给出的数组中第二个参数的所有出现的下标数组(数组必须是一维的)array_positions(ARRAY['A','A','B','A'], 'A'){1,2,4}
array_prepend(anyelement, anyarray)anyarray将元素附加到数组的开头array_prepend(1, ARRAY[2,3]){1,2,3}
array_remove(anyarray, anyelement)anyarray从数组中删除所有与给定值相等的元素(数组必须是一维的)array_remove(ARRAY[1,2,3,2], 2){1,3}
array_replace(anyarray, anyelement, anyelement)anyarray用新值替换等于给定值的每个数组元素array_replace(ARRAY[1,2,5,4], 5, 3){1,2,3,4}
array_to_string(anyarray, text [, text])text使用提供的定界符和可选的 null 字符串连接数组元素array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*')1,2,3,*,5
array_upper(anyarray, int)int返回请求的数组维的上限array_upper(ARRAY[1,8,3,7], 1)4
cardinality(anyarray)int返回数组中元素的总数;如果数组为空,则返回 0cardinality(ARRAY[[1,2],[3,4]])4
string_to_array(text, text [, text])text[]使用提供的定界符和可选的空字符串将字符串拆分为数组元素string_to_array('xx~^~yy~^~zz', '~^~', 'yy'){xx,NULL,zz}
unnest(anyarray)setof anyelement将数组扩展为一组行unnest(ARRAY[1,2])1

2(2 行)
unnest(anyarray, anyarray [, ...])setof anyelement, anyelement [, ...]将多个数组(可能具有不同的类型)扩展为一组行。这仅在 FROM 子句中允许;看到Section 7.2.1.4unnest(ARRAY[1,2],ARRAY['foo','bar','baz'])1 个
2 条
NULL baz(3 行)

array_positionarray_positions中,使用IS NOT DISTINCT FROM语义将每个数组元素与搜索到的值进行比较。

如果找不到该值,则在array_position中返回NULL

array_positions中,仅当数组为NULL时才返回NULL;如果在数组中找不到该值,则返回一个空数组。

string_to_array中,如果 delimiter 参数为 NULL,则 Importing 字符串中的每个字符将成为结果数组中的单独元素。如果定界符为空字符串,则整个 Importing 字符串将作为一个单元素数组返回。否则,在每次出现分隔符字符串时都会对 Importing 字符串进行拆分。

string_to_array中,如果省略 null 字符串参数或 NULL,则 Importing 的任何子字符串都不会替换为 NULL。在array_to_string中,如果 null 字符串参数被省略或为 NULL,则数组中的任何 null 元素都将被简单跳过,并且不会在输出字符串中表示。

Note

string_to_array的行为与 9.1 之前的 PostgreSQL 版本有两个区别。首先,当 Importing 字符串的长度为零时,它将返回一个空(零元素)数组,而不是 NULL。其次,如果定界符字符串为 NULL,则该函数将 Importing 拆分为单个字符,而不是像以前一样返回 NULL。

另请参阅Section 9.20有关用于数组的聚合函数array_agg