Clickhouse兼容函数

Hologres已支持部分Clickhouse函数或其同语义函数。本文为您介绍Clickhouse函数在Hologres中的支持情况与使用方法,以及部分常见函数的同语义改写方法。

字符串函数

Clickhouse常用字符串函数与Hologres语法基本一致,包括length、lower、upper、concat、substring、trim等函数,具体函数及使用方法请参见字符串函数

数学函数

Clickhouse常用数学函数与Hologres语法基本一致,包括cbrt、degrees、exp、ln、log、pi、radians、sign、sqrt等函数,具体函数及使用方法请参见数学函数

类型转换函数

Hologres从V1.3.36版本起支持如下Clickhouse类型转换函数,暂不支持常量入参。其他数据类型转换场景请使用CAST(col AS type)col::type语法。

建表及数据插入语句如下,函数用例基于此表进行查询。

CREATE TABLE public.tb1 (
 id bigint NOT NULL,
 id_text text,
 data_date text,
 data_float text,
 data_text text
);
INSERT INTO public.tb1 VALUES (1234,'123','20190102','1.23','hologres');

toString(anyelement)

  • 描述将任一类型转换为text类型。

  • 返回类型:text。

  • 使用示例:

    SELECT toString(id) from public.tb1;
    
    --返回结果
    1234

toInt64(anyelement)

  • 描述将其他数字类型转换为bigint类型。

    说明

    如果非数字类型使用此函数进行转换,数据类型不兼容将会导致报错。

  • 返回类型:bigint。

  • 使用示例:

    SELECT toInt64(id_text) from public.tb1;
    
    --返回结果
    1234

toInt32(anyelement)

  • 描述将其他数字类型转换为int类型。

    说明

    如果非数字类型使用此函数进行转换,数据类型不兼容将会导致报错。

  • 返回类型:int。

  • 使用示例:

    SELECT toInt32(id_text) from public.tb1;
    
    --返回结果
    123

toDate(text)

  • 描述将text类型转换为date类型。

  • 返回类型:date。

  • 使用示例:

    • 转换成功。

      SELECT toDate(data_date) from public.tb1;
      
      --返回结果
      2019-01-02

    • 数据类型不兼容导致报错。

      SELECT toDate(data_text) from public.tb1;
      
      --返回结果
      ERROR: *** invalid input syntax for type date ***

toFloat64(anyelement)

  • 描述将其他数字类型转换为double类型。

  • 返回类型:double precision。

  • 使用示例:

    SELECT toFloat64(data_float) from public.tb1;
    
    --返回结果
    1.23

时间和日期函数

Hologres更多时间和日期函数及其使用方法请参见时间和日期转换函数

toYear、toMonth、toQuarter等

  • 描述从时间戳中获取年、月、季度等子字段。

  • Hologres实现:extract(field from timestamp)date_part(text, timestamp),详情请参见时间日期截取函数

  • 使用示例:

    • SELECT extract(month FROM timestamp '2001-02-16 20:38:40');
      
      --返回结果
      2

    • SELECT extract(quarter FROM timestamp '2001-02-16 20:38:40');
      
      --返回结果
      1

addDays、addMonths、addYears等

  • 描述将时间戳增加一段时间间隔。

  • Hologres实现:操作符+

  • 使用示例:

    SELECT date '2001-09-28' + interval '1 hour';
    
    --返回结果
    2001-09-28 01:00:00

subtractDays、subtractMonths、subtractYears等

  • 描述将时间戳减去一段时间间隔。

  • Hologres实现:操作符-

  • 使用示例:

    SELECT date '2001-09-28' - interval '1 day';
    
    --返回结果
    2001-09-27 00:00:00

聚合函数

Hologres更多聚合函数及其使用方法请参见通用聚合函数APPROX_COUNT_DISTINCTUNIQMAX_BY与MIN_BY

argMin(x, y)

  • 描述:计算y列最小值对应x列的值。

  • Hologres实现:min_by(x, y)。

    说明
    • 当y列最小值对应多个不同的x值,输出其中的最小值。

    • Hologres V1.3.36版本起支持。

  • 使用示例:test 表建表语句请参见示例

    SELECT min_by(name, cost) FROM test;
    
    --返回结果
     min_by
    --------
     cc
    (1 row)

argMax(x, y)

  • 描述:计算y列最大值对应x列的值。

  • Hologres实现:max_by(x, y)。

    说明
    • 当y列最大值对应多个不同的x值,输出其中的最大值。

    • Hologres V1.3.36版本起支持。

  • 使用示例:test 表建表语句请参见示例

    SELECT id, max_by(name, cost) FROM test GROUP BY id;
    
    --返回结果
     id | max_by
    ----+--------
      2 | bb
      1 | aaa
      3 | c
    (3 rows)

groupArray(anyelement)

  • 描述:将表达式的值串联到数组中。

  • Hologres实现:array_agg(anyelement)。

  • 使用示例:

    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)

数组函数

Hologres更多数组函数及其使用方法请参见数组函数

arrayJoin(anyarray)

  • 描述:将数组的每个元素扩展到单独行。

  • Hologres实现:unnest(anyarray) 。

  • 使用示例:

    SELECT unnest(ARRAY[1,2]);
    
    --返回结果
    1
    2

arrayConcat(anyarray, anyarray...)

  • 描述:合并所有数组。

  • Hologres实现:array_cat(anyarray,anyarray),支持合并2个数组。

  • 使用示例:

    SELECT array_cat(array_cat(ARRAY[1,2], ARRAY[3,4]), ARRAY[5,6]);
    
    --返回结果
    {1,2,3,4,5,6}

arrayDistinct(anyarray)

  • 描述:返回数组中去重后的元素组成的新数组。

  • Hologres实现:array_distinct(anyarray)。

    说明

    Hologres V1.3.19版本起支持array_distinct函数,暂不支持常量入参。

  • 使用示例:

    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)

arrayMin(anyarray)

  • 描述:返回数组元素的最小值。

  • Hologres实现:array_min(anyarray)。

    说明

    Hologres 1.3.19起支持array_min函数,暂不支持常量入参。

  • 使用示例:

    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)

arrayMax(anyarray)

  • 描述:返回数组元素的最大值。

  • Hologres实现:array_max(anyarray)。

    说明

    Hologres 1.3.19起支持array_max函数,暂不支持常量入参。

  • 使用示例:

    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)

arraySum(anyarray)

  • 描述:返回数组元素的和。

  • Hologres实现:

    • uunest函数计算。

    • func函数计算。

    • 求和。

  • 使用示例:

    SELECT sum(ele) FROM (SELECT unnest(ARRAY[1,2,4]) AS ele) a;
    
    --返回结果
    7

Bitmap函数

Hologres更多Bitmap函数及其使用方法请参见Roaring Bitmap函数

bitmapToArray(roaringbitmap)

  • 描述:返回Bitmap对应整型数组。

  • Hologres实现:rb_to_array(roaringbitmap)。

  • 使用示例:

    SELECT rb_to_array(rb_build('{1,2,3}'));
    
    --返回结果
    {1,2,3}

groupBitmapState(integer)

  • 描述:将表达式的值聚合成Bitmap。

  • Hologres实现:rb_build_agg(integer)。

  • 使用示例:

    SELECT rb_build_agg(1);
    
    --返回结果
    \x3a3000000100000000000000100000000100

groupBitmap(integer)

  • 描述:计算表达式的值聚合成的bitmap的基数。

  • Hologres实现:先使用rb_build_agg函数将表达式的值聚合成bitmap,再使用rb_cardinality函数计算基数:rb_cardinality(rb_build_agg(integer))

  • 使用示例:

    SELECT rb_cardinality(rb_build_agg(1));
    
    --返回结果
    1

groupBitmapAndState(roaringbitmap)

  • 描述:Bitmap的And聚合计算。

  • Hologres实现:rb_and_agg(roaringbitmap)。

  • 使用示例:

    SELECT rb_and_agg(rb_build('{1,2,3}'));
    
    --返回结果
    \x3a300000010000000000020010000000010002000300

groupBitmapOrState(roaringbitmap)

  • 描述:Bitmap的Or聚合计算。

  • Hologres实现:rb_or_agg(roaringbitmap)。

  • 使用示例:

    SELECT rb_or_agg(rb_build('{1,2,3}'));
    
    --返回结果
    \x3a300000010000000000020010000000010002000300

groupBitmapAnd(roaringbitmap)

  • 描述:Bitmap的And聚合计算并返回其基数。

  • Hologres实现:rb_and_cardinality_agg(roaringbitmap)。

  • 使用示例:

    SELECT rb_and_cardinality_agg(rb_build('{1,2,3}'));
    
    --返回结果
    3

groupBitmapOr(roaringbitmap)

  • 描述:Bitmap的Or聚合计算并返回其基数。

  • Hologres实现:rb_or_cardinality_agg(roaringbitmap)。

  • 使用示例:

    SELECT rb_or_cardinality_agg(rb_build('{1,2,3}'));
    
    --返回结果
    3

Hash函数

sipHash64(text)

  • 描述:返回text对应的64位SipHash值,返回类型为UInt64。

  • Hologres实现:hg_sip_hash_64(text)。

    说明
    • 返回类型为BIGINT。

    • Hologres V2.0.1版本起支持sipHash64函数。

    • 暂不支持常量入参。

  • 使用示例:

    CREATE TABLE test_hg_sip_hash_64_text (c1 text);
    INSERT INTO test_hg_sip_hash_64_text VALUES ('abc');
    
    SELECT hg_sip_hash_64 (c1) FROM test_hg_sip_hash_64_text;
    
    --返回结果
    4596069200710135518

其他函数

PostgreSQL兼容函数众多,除字符串函数、数学函数外,还有很多函数与Clickhouse语法一致。更多函数及使用方法请参见PostgreSQL