更新时间:2026-07-15 GMT+08:00

数组函数

数组操作函数对输入的数组数据进行一些基本操作,如添加元素、查找元素,转换数组并返回操作后的数组数据。

DWS支持的数组函数参考表1

表1 数组函数

函数名称

功能

使用示例

array_append(anyarray, anyelement)

向数组末尾添加元素。

1
SELECT array_append(ARRAY[1,2], 3) AS RESULT;

array_prepend(anyelement, anyarray)

向数组开头添加元素

1
SELECT array_append(ARRAY[1,2], 3) AS RESULT;

array_cat(anyarray, anyarray)

连接两个数组。

1
SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]) AS RESULT;

array_ndims(anyarray)

返回数组的维数。

1
SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT;

array_dims(anyarray)

返回数组维数的文本表示。

1
SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT;

array_length(anyarray, int)

返回数组维度的长度。

1
SELECT array_length(array[1,2,3], 1) AS RESULT;

array_lower(anyarray, int)

返回数组维数的下界。

1
SELECT array_lower('[0:2]={1,2,3}'::int[], 1) AS RESULT;

array_upper(anyarray, int)

返回数组维数的上界。

1
SELECT array_upper(ARRAY[1,8,3,7], 1) AS RESULT;

array_to_string(anyarray, text [, text])

将数组转换为字符串。

1
SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') AS RESULT;

string_to_array(text, text [, text])

将字符串转换为数组。

1
SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy') AS RESULT;

array_flatten(anyarray)

将多维数组转换为一维数组。

1
SELECT array_flatten(ARRAY[1, 2], [3,4]]) AS RESULT;

array_distinct(anyarray)

返回去重之后的数组,不统计NULL值。

1
SELECT array_distinct(ARRAY[1, 2, 3, 1, NULL, 5]) AS RESULT;

array_uniq(anyarray)

返回去重之后的数组元素个数。

1
SELECT array_uniq(ARRAY[1, 2, 3, 1, NULL, 5]) AS RESULT;

array_sort(anyarray)

返回按升序排列后的数组。

1
SELECT array_sort(ARRAY[1, 2, 3, 1, NULL, 5]) AS RESULT;

array_reversesort(anyarray)

返回按降序排列后的数组。

1
SELECT array_reversesort(ARRAY[1, 2, 3, 1, NULL, 5]) AS 

unnest(anyarray)

扩展一个数组为一组行。

1
SELECT unnest(ARRAY[1,2]) AS RESULT;

interval(N, N1, N2, N3 ... )

从输入的整数数组中,查找返回最后一个小于等于目标参数n的数组索引。

1
SELECT INTERVAL(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11) AS RESULT;

split(text, text)

将字符串按分隔符进行分隔,并返回数组。

1
SELECT SPLIT('a-b-c-d-e', '-') AS RESULT;

array_append(anyarray, anyelement)

描述:向数组末尾添加元素,只支持一维数组。

返回类型:anyarray

示例:向数组[1,2]末尾添加元素3。

1
2
3
4
5
SELECT array_append(ARRAY[1,2], 3) AS RESULT;
 result  
---------
 {1,2,3}
(1 row)

array_prepend(anyelement, anyarray)

描述:向数组开头添加元素,只支持一维数组。

返回类型:anyarray

示例:向数组[2,3]开头添加元素1。

1
2
3
4
5
SELECT array_prepend(1, ARRAY[2,3]) AS RESULT;
 result  
---------
 {1,2,3}
(1 row)

array_cat(anyarray, anyarray)

描述:连接两个数组,支持多维数组。

返回类型:anyarray

示例:连接数组[1,2,3]和数组[4,5]。

1
2
3
4
5
SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]) AS RESULT;
   result    
-------------
 {1,2,3,4,5}
(1 row)

连接二维数组[[1,2],[4,5]]和一维数组[6,7]。

1
2
3
4
5
SELECT array_cat(ARRAY[[1,2],[4,5]], ARRAY[6,7]) AS RESULT;
       result        
---------------------
 {{1,2},{4,5},{6,7}}
(1 row)

array_ndims(anyarray)

描述:返回数组的维数。

返回类型:int

示例:查看数组[[1,2,3], [4,5,6]]的维数。

1
2
3
4
5
SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT;
 result 
--------
      2
(1 row)

array_dims(anyarray)

描述:返回数组维数的文本表示。

返回类型:text

示例:获取数组的维度,返回结果表示该数组是一个2行3列的二维数组。

1
2
3
4
5
SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT;
   result   
------------
 [1:2][1:3]
(1 row)

array_length(anyarray, int)

描述:返回数组维度的长度。

返回类型:int

示例:计算数组[1,2,3]在第一维的长度。

1
2
3
4
5
SELECT array_length(array[1,2,3], 1) AS RESULT;
 result 
--------
      3
(1 row)

array_lower(anyarray, int)

描述:返回数组维数的下界。

返回类型:int

示例:查询指定范围的数组[0:2]={1,2,3},在第一维的下界。

1
2
3
4
5
SELECT array_lower('[0:2]={1,2,3}'::int[], 1) AS RESULT;
 result 
--------
      0
(1 row)

array_upper(anyarray, int)

描述:返回数组维数的上界。

返回类型:int

示例:查询数组 [1, 8, 3, 7]在第一维的上界。

1
2
3
4
5
SELECT array_upper(ARRAY[1,8,3,7], 1) AS RESULT;
 result 
--------
      4
(1 row)

array_to_string(anyarray, text [, text])

描述:将数组转换为字符串,并用指定的分隔符连接,同时支持定义如何处理数组中的NULL。

第一个text作为数组的新分隔符,第二个text替换数组值为NULL的值。

返回类型:text

示例:将数组[1, 2, 3, NULL, 5]转换为字符串,用“,”分隔元素,并用“*”替换NULL值。

1
2
3
4
5
SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') AS RESULT;
  result   
-----------
 1,2,3,*,5
(1 row)

该函数的第二个参数text,控制如何处理数组中的NULL元素。如果省略此参数或显式指定为NULL,函数将忽略数组中所有NULL元素,且不会出现在最终输出的字符串中。

例如:

省略第二个参数text的场景。

1
2
3
4
5
SELECT array_to_string(ARRAY[1, NULL, 3, NULL, 5], ',') AS result;
 result
--------
 1,3,5
(1 row)

第二个参数text显式指定为NULL场景。

1
2
3
4
5
SELECT array_to_string(ARRAY[1, NULL, 3, NULL, 5], ',',NULL) AS RESULT;
 result
--------
 1,3,5
(1 row)

string_to_array(text, text [, text])

描述:将字符串按指定的分隔符拆分成数组,同时支持替换特定值为NULL。

第二个text为指定的分隔符。第三个可选的text替换特定值为NULL,如果分隔后的子串与第三个可选的text完全匹配,则将其替换为NULL。

返回类型:text[]

示例:将字符串xx~^~yy~^~zz按照分隔符“~^~”拆分成数组,并替换 'yy' 值为NULL。

1
2
3
4
5
SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy') AS RESULT;
    result    
--------------
 {xx,NULL,zz}
(1 row)

字符串xx~^~yy~^~zz分隔后的子串yy与参数“y”未完全匹配,不会将其替换为NULL。

1
2
3
4
5
SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'y') AS RESULT;
   result   
------------
 {xx,yy,zz}
(1 row)
  • 该函数的第三个参数text,控制替换特定值为NULL。如果省略此参数或显式指定为NULL,函数会将原字符串中连续两个分隔符之间的空子串替换为NULL。

    例如:

    省略第三个参数text的场景。

    1
    2
    3
    4
    5
    SELECT string_to_array('a,,b', ',') AS result;
      result
    ----------
     {a,"",b}
    (1 row)
    

    第三个参数text显式指定为NULL场景。

    1
    2
    3
    4
    5
    SELECT string_to_array('a,,b', ',', NULL) AS result;
      result
    ----------
     {a,"",b}
    (1 row)
    
  • 在string_to_array中,如果分隔符参数是NULL,输入字符串中的每个字符将在结果数组中变成一个独立的元素。如果分隔符是一个空字符串,则整个输入的字符串将变为一个元素的数组。否则输入字符串将在每个分隔字符串处分开。

    例如:

    分隔符参数是NULL的场景。

    1
    2
    3
    4
    5
    SELECT string_to_array('abc', NULL) AS result;
     result
    ---------
     {a,b,c}
    (1 row)
    

    分隔符是一个空字符串的场景。

    1
    2
    3
    4
    5
    SELECT string_to_array('abcde', ' ')AS result;
     result
    ---------
     {abcde}
    (1 row)
    

array_flatten(anyarray)

描述:将多维数组转换为一维数组。该函数仅9.1.1.100及以上集群版本支持。

返回类型:anyarray

示例:

1
2
3
4
5
SELECT array_flatten(ARRAY[1, 2], [3,4]]) AS RESULT;
  result   
-----------
 1,2,3,4
(1 row)

array_distinct(anyarray)

描述:返回去重之后的数组,不统计NULL值。该函数仅9.1.1.100及以上集群版本支持。

返回类型:anyarray

示例:

1
2
3
4
5
SELECT array_distinct(ARRAY[1, 2, 3, 1, NULL, 5]) AS RESULT;
  result   
-----------
 1,2,3,5
(1 row)

array_distinct()、array_uniq()、array_sort()、array_reversesort()函数只支持一维数组。

array_uniq(anyarray)

描述:返回去重之后的数组元素个数。如果数组元素包含NULL,也会统计。该函数仅9.1.1.100及以上集群版本支持。

返回类型:int

示例:

1
2
3
4
5
SELECT array_uniq(ARRAY[1, 2, 3, 1, NULL, 5]) AS RESULT;
  result   
---------
       5
(1 row)

array_sort(anyarray)

描述:返回按升序排列后的数组。如果数组元素包含NULL,则输出的排序数组会将NULL排在最后。该函数仅9.1.1.100及以上集群版本支持。

返回类型:anyarray

示例:

1
2
3
4
5
SELECT array_sort(ARRAY[1, 2, 3, 1, NULL, 5]) AS RESULT;
  result   
---------
 1,1,2,3,5,NULL
(1 row)

array_reversesort(anyarray)

描述:返回按降序排列后的数组。如果数组元素包含NULL,则输出的排序数组会将NULL排在最后。该函数仅9.1.1.100及以上集群版本支持。

返回类型:anyarray

示例:

1
2
3
4
5
SELECT array_reversesort(ARRAY[1, 2, 3, 1, NULL, 5]) AS RESULT;
  result   
---------
 5,3,2,1,1,NULL
(1 row)

unnest(anyarray)

描述:扩展一个数组为一组行。

返回类型:setof anyelement

示例:

1
2
3
4
5
6
SELECT unnest(ARRAY[1,2]) AS RESULT;
 result 
--------
      1
      2
(2 rows)

unnest函数配合string_to_array(text, text [, text])数组使用。数组转列,先将字符串按逗号分割成数组,然后再把数组转成列:

1
2
3
4
5
6
7
8
SELECT unnest(string_to_array('a,b,c,d',',')) AS RESULT;
 result
--------
 a
 b
 c
 d
(4 rows)

interval(N, N1, N2, N3 ... )

描述:从输入的整数数组中,查找返回最后一个小于等于目标参数n的数组索引。

若n为NULL,返回-1。interval函数不支持interval(N, N1)的场景。

返回类型:int

示例:查找数字10位于后面一串数字划分的哪个区间,并返回对应的区间索引。

1
2
3
4
5
SELECT INTERVAL(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11) AS RESULT;
 result    
--------
     11
(1 row)

split(text, text)

描述:将字符串按分隔符进行分隔,并返回数组。

第一个参数text为字符串,第二个参数text为分隔符。

返回类型:text[]

示例:将字符串a-b-c-d-e按照分隔符“-”拆分成多个部分,并返回一个数组。

1
2
3
4
5
SELECT SPLIT('a-b-c-d-e', '-') AS RESULT;
   result    
-------------
 {a,b,c,d,e}
(1 row)

将字符串a-b-c-d-e按照分隔符“-”拆分并提取第四个元素。

1
2
3
4
5
SELECT SPLIT('a-b-c-d-e', '-')[4] AS RESULT;
 result   
--------
 d
(1 row)