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, NULL, 5], ',', '*')1,2,3,*,5
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)ARRAYarray中去除重复项。
说明 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)