首页 / 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 值。 |