数仓 SQL 函数对照

首页 / Hologres

Hologres 函数写法

Hologres 常用函数的写法和注意事项,以及迁移到其他数仓引擎时需要改写的地方。

函数用途支持写法说明
ADD_MONTHS 按月加减 需改写 d + interval '1 month' ADD_MONTHS 是 Oracle 兼容函数,需要先加载 orafce 扩展。原生写法用 interval 加减。
ANY_VALUE 取组内任意值 需改写 MAX(col) 通用聚合函数中没有 ANY_VALUE。组内值都相同时,可以用 MAX 或 MIN 代替。
COLLECT_LIST 聚合为数组 需改写 ARRAY_AGG(expression) 没有 COLLECT_LIST,用 ARRAY_AGG。
COLLECT_SET 去重聚合为数组 需改写 ARRAY_AGG(DISTINCT expression) 没有 COLLECT_SET,用 ARRAY_AGG。不支持 JSON、JSONB、INTERVAL 和数组等类型。
CONCAT 字符串拼接 支持 CONCAT(str1, str2, ...) NULL 参数会被忽略:CONCAT('abcde', 2, NULL, 22) 返回 abcde222。
CONCAT_WS 按分隔符拼接 支持 CONCAT_WS(sep, str[, str ...]) 分隔符为 NULL 时返回 NULL,NULL 值会被忽略。参数可以是任意类型。
DATE_ADD 日期加减 需改写 DATEADD(d, num, 'day') 文档中没有 DATE_ADD,可以用 DATEADD 或 d + interval。DATEADD 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。
DATE_FORMAT 日期格式化 需改写 TO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS') 文档中没有 DATE_FORMAT,用 TO_CHAR 代替。格式符是 PostgreSQL 风格,HH 默认是 12 小时制,24 小时制要写 HH24。
DATEDIFF 日期差 支持 DATEDIFF(d1, d2, unit) 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。不足一个单位时返回 0,不允许所有参数都是常量。DATE 相减也可以直接得到天数。
DATETRUNC 日期截断 需改写 DATE_TRUNC('month', ts) 单位在前,返回 TIMESTAMP 或 TIMESTAMPTZ。
EXPLODE 数组展开为多行 需改写 UNNEST(anyarray) 把数组的每个元素展开成一行。
FROM_UNIXTIME 时间戳转日期 需改写 TO_TIMESTAMP(seconds) 文档中没有 FROM_UNIXTIME。TO_TIMESTAMP(double precision) 按秒转换,返回 TIMESTAMPTZ。需要字符串时再用 TO_CHAR。
GET_JSON_OBJECT 提取 JSON 字段 支持 GET_JSON_OBJECT(json, json_path) 属于 hive_compatible 扩展,使用前需要先执行 CREATE EXTENSION。
IF 条件判断 支持 IF(condition, value_if_true, value_if_false) V2.1 起支持,条件为 FALSE 或 NULL 时返回第三个参数。V2.0 及以下版本需要升级实例,或改写为 CASE WHEN。
LAST_DAY 当月最后一天 支持 LAST_DAY(ts) 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。
MAX_BY 取最大值对应的列 支持 MAX_BY(x, y) V1.3.36 起提供,同时有 MIN_BY。
MAX_PT 取最新分区 支持 MAX_PT('table_name') 返回 Hologres 分区表的最大分区。文档没有说明版本要求和是否支持外部表。
NVL 空值替换 需改写 COALESCE(value, default_value) 条件函数文档中没有 NVL,只有 COALESCE、IF、NULLIF 等,需要改写为 COALESCE。
REGEXP_REPLACE 正则替换 支持 REGEXP_REPLACE(str, regex, replacement[, flags]) 使用 POSIX 正则。按 PostgreSQL 的定义,不加 flags 时只替换第一处匹配,flags 包含 g 时替换全部。
SPLIT 字符串拆分 需改写 REGEXP_SPLIT_TO_ARRAY(str, pattern) 字符串函数中没有 SPLIT。拆成数组用 REGEXP_SPLIT_TO_ARRAY,只取第 n 段用 SPLIT_PART(str, delimiter, n)。
SUBSTR 截取子串 需改写 SUBSTRING(str FROM start FOR len) SUBSTR 是 Oracle 兼容函数,需要先加载 orafce 扩展。PostgreSQL 标准写法是 SUBSTRING。
TO_DATE 字符串转日期 支持 TO_DATE(text, format) PostgreSQL 风格格式符,例如 YYYY-MM-DD。文档写的返回类型是 TEXT,但示例结果是日期,建议实测。
UNIX_TIMESTAMP 日期转时间戳 需改写 EXTRACT(EPOCH FROM ts) 日期函数中没有 UNIX_TIMESTAMP。EXTRACT 的 epoch 字段返回秒数,类型是 DOUBLE PRECISION。
WM_CONCAT 分组拼接字符串 需改写 STRING_AGG(expression, delimiter) 分隔符写在后面,只拼接非 NULL 值。