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_DISTINCT、UNIQ、MAX_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。