9.18. 数组函数和运算符

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

表 9.48. 数组运算符

Operator Description Example Result
= equal ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] t
<> not equal ARRAY[1,2,3] <> ARRAY[1,2,4] t
< less than ARRAY[1,2,3] < ARRAY[1,2,4] t
> greater than ARRAY[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
@> contains ARRAY[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 concatenation ARRAY[1,2,3] || ARRAY[4,5,6] {1,2,3,4,5,6}
|| array-to-array concatenation ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] {{1,2,3},{4,5,6},{7,8,9}}
|| element-to-array concatenation 3 || ARRAY[4,5,6] {3,4,5,6}
|| array-to-element concatenation ARRAY[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. 数组函数

Function Return Type Description Example Result
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 返回数组中元素的总数;如果数组为空,则返回 0 cardinality(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.4 unnest(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

上一章 首页 下一章