全部产品
Search
文档中心

实时数仓Hologres:数组函数

更新时间:May 04, 2023

Hologres兼容PostgreSQL,支持使用标准的PostgreSQL语法进行开发。

Hologres已支持的数组函数列表如下。当前Hologres版本支持的函数是PostgreSQL的一个子集,函数的使用方法请参见数组函数

使用限制

array_maxarray_minarray_containsarray_exceptarray_distinctarray_union函数暂不支持常量查询,例如:select array_max(ARRAY[-2, NULL, -3, -12, -7]);

操作符

操作符

返回类型

描述

用例

结果

@>

BOOLEAN

判断两个数组是否为包含关系。

SELECT ARRAY[1,2,3] @> ARRAY[1,2];

t

<@

BOOLEAN

判断两个数组是否为被包含关系。

SELECT ARRAY[1,2,3] <@ ARRAY[1,2];

f

&&

BOOLEAN

判断两个数组是否有相同元素。

说明

Hologres从V1.3.37版本开始支持Array列作为输入。

SELECT ARRAY[1,2,3] && ARRAY[1,2];

t

函数列表

函数名

返回类型

描述

用例

结果

array_to_string(anyarray,text[,text])

TEXT

使用提供的定界符和可选的空串连接数组元素。

array_to_string(ARRAY[1, 2, 3], ',')

1,2,3

array_agg(anyelement)

ARRAY

将表达式的值串联到数组中。

  • Hologres从V1.3版本开始支持DECIMAL、DATE、TIMESTAMP、TIMESTAMPTZ数据类型。

  • 暂不支持JSON、JSONB、TIMETZ、INTERVAL、INET、OID、UUID数据类型。

  • 暂不支持数组类型。

CREATE TABLE test_array_agg_int (
    c1 int
);

INSERT INTO test_array_agg_int
    VALUES (1), (2);

SELECT
    array_agg (c1)
FROM
    test_array_agg_int;
 array_agg
-----------
 {1,2}
(1 row)

array_agg (expression[ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ]

ARRAY

将表达式的值串联到数组中。Hologres从V1.3版本开始支持filter过滤

CREATE TABLE test_array_agg_int (
    c1 int
);

INSERT INTO test_array_agg_int
    VALUES (1), (2);

SELECT
    array_agg (c1) filter (where c1 >1)
FROM
    test_array_agg_int;
 array_agg
-----------
 {2}

array_append(anyarray, anyelement)

ARRAY

添加元素至数组的尾部。

array_append(ARRAY[1,2], 3)

{1,2,3}

array_cat(anyarray,anyarray)

ARRAY

连接两个数组。

array_cat(ARRAY[1,2,3], ARRAY[4,5])

{1,2,3,4,5}

array_ndims(anyarray)

ARRAY

返回数组的维度数。

array_ndims(ARRAY[[1,2,3], [4,5,6]])

2

array_dims(anyarray)

ARRAY

使用文本形式表示数组的维度。

array_dims(ARRAY[[1,2,3], [4,5,6]])

[1:2][1:3]

array_length(anyarray, int)

ARRAY

返回被请求的数组维度的长度。

array_length(ARRAY[1,2,3], 1)

3

array_lower(anyarray, int)

ARRAY

返回ANYARRAY数组维度的下限。

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

0

array_positions(anyarray, anyelement)

ARRAY

返回在第一个参数给定的数组(数组必须是一维的)中, 第二个参数所有出现位置的下标组成的数组。

array_positions(ARRAY['A','A','B','A'], 'A')

{1,2,4}

array_prepend(anyelement, anyarray)

ARRAY

添加元素至数组的头部。

array_prepend(1, ARRAY[2,3])

{1,2,3}

array_remove(anyarray, anyelement)

ARRAY

从数组中移除所有等于给定值的所有元素。

array_remove(ARRAY[1,2,3,2], 2)

{1,3}

array_sort(anyarray)

ARRAY

对数组元素进行排序。

  • Hologres从 V1.1.46版本开始支持text类型数组,且text数组将会被转为int8数组进行排序,返回排序后的text数组。

  • Hologres从 V1.3.18版本开始支持int4、int8、float4、float8、boolean类型数组,且对text类型数组按字典序排序。

array_sort(ARRAY[1,3,2,1])

{1,1,2,3}

array_upper(anyarray, int)

INT

返回ANYARRAY数组维度的上限。

array_upper(ARRAY[1,8,3,7], 1)

4

unnest(anyarray)

TEXT

将数组的每个元素扩展为单独行。

unnest(ARRAY[1,2])

1

2

(2 rows)

array_max(array)

INT

返回数组中所有数据的最大值。计算过程中会跳过NULL值。

说明

Hologres V1.3.19及以上版本支持。

CREATE TABLE test_array_max_int (
    c1 int[]
);

INSERT INTO test_array_max_int
    VALUES (NULL), (ARRAY[-2, NULL, -3, -12, -7]);

SELECT
    c1,
    array_max (c1)
FROM
    test_array_max_int;
        c1        | array_max
------------------+-----------
                  |
 {-2,0,-3,-12,-7} |         0
(2 rows)

array_min(array)

INT

返回数组中所有数据的最小值。

说明

Hologres V1.3.19及以上版本支持。

CREATE TABLE test_array_min_text (
    c1 text[]
);

INSERT INTO test_array_min_text
    VALUES (NULL), (ARRAY['hello', 'holo', 'blackhole', 'array']);

SELECT
    c1,
    array_min (c1)
FROM
    test_array_min_text;
              c1              | array_min
------------------------------+-----------
                              |
 {hello,holo,blackhole,array} | array
(2 rows)

array_contains(array, target_value)

BOOLEAN

如果数组包含target_value,则返回true,反之返回false

说明

Hologres V1.3.19及以上版本支持。

CREATE TABLE test_array_contains_text (
    c1 text[],
    c2 text
);

INSERT INTO test_array_contains_text
    VALUES (ARRAY[NULL, 'cs', 'holo', 'sql', 'a', NULL, ''], 'holo')
                , (ARRAY['holo', 'array', 'FE', 'l', NULL, ''], 'function');

SELECT
    c1,
    c2,
    array_contains (c1, c2)
FROM
    test_array_contains_text;
            c1            |    c2    | array_contains
--------------------------+----------+----------------
 {holo,array,FE,l,"",""}  | function | f
 {"",cs,holo,sql,a,"",""} | holo     | t
(2 rows)

array_except(array1, array2)

ARRAY

返回属于array1而不属于array2的元素组成的数组。

说明

Hologres V1.3.19及以上版本支持。

CREATE TABLE test_array_except_text (
    c1 text[],
    c2 text[]
);

INSERT INTO test_array_except_text
    VALUES (ARRAY['o', 'y', 'l', 'l', NULL, ''], NULL), (ARRAY['holo', 'hello', 'hello', 'SQL', '', 'blackhole'], ARRAY['holo', 'SQL', NULL, 'kk']);

SELECT
    c1,
    c2,
    array_except (c1, c2)
FROM
    test_array_except_text;
                 c1                  |        c2        |   array_except
-------------------------------------+------------------+-------------------
 {o,y,l,l,"",""}                     |                  | {o,l,y,""}
 {holo,hello,hello,SQL,"",blackhole} | {holo,SQL,"",kk} | {blackhole,hello}
(2 rows)

array_distinct(array)

ARRAY

array中去除重复项。

说明

Hologres V1.3.19及以上版本支持。

CREATE TABLE test_array_distinct_text (
    c1 text[]
);

INSERT INTO test_array_distinct_text
    VALUES (ARRAY['holo', 'hello', 'holo', 'SQL', 'SQL']), (ARRAY[]::text[]);

SELECT
    c1,
    array_distinct (c1)
FROM
    test_array_distinct_text;
            c1             |  array_distinct
---------------------------+------------------
 {holo,hello,holo,SQL,SQL} | {SQL,hello,holo}
 {}                        | {NULL}
(2 rows)

array_union(array1, array2)

ARRAY

返回array1array2元素并集构成的数组,不含重复项。

说明

Hologres V1.3.19及以上版本支持。

CREATE TABLE test_array_union_int (
    c1 int[],
    c2 int[]
);

INSERT INTO test_array_union_int
    VALUES (NULL, ARRAY[2, -3, 2, 7]), (ARRAY[2, 7, -3, 2, 7], ARRAY[12, 9, 8, 7]);

SELECT
    c1,
    c2,
    array_union (c1, c2)
FROM
    test_array_union_int;
      c1      |     c2     |   array_union
--------------+------------+-----------------
              | {2,-3,2,7} | {2,7,-3}
 {2,7,-3,2,7} | {12,9,8,7} | {9,2,7,8,12,-3}
(2 rows)