SQL 方言通

首页 / 工具 / 迁移清单 / Doris → Hologres

Doris 迁移到 Hologres 的函数改写清单

从 Doris 迁移到 Hologres 时,在 Doris 有对应写法的 44 个常用函数中,28 个需要改写(其中 2 个在 Hologres 没有对应函数)。逐个列出两边写法和注意事项。

需要改写的函数 · 迁移注意事项 · 可以直接用的函数 · 反向:Hologres 迁移到 Doris

需要改写的函数

函数Doris 写法Hologres 写法Hologres 说明
ADD_MONTHSMONTHS_ADD(date, nums)需改写 d + interval '1 month'ADD_MONTHS 是 Oracle 兼容函数,需要先加载 orafce 扩展。原生写法用 interval 加减。
ANY_VALUEANY_VALUE(expr)需改写 MAX(col)通用聚合函数中没有 ANY_VALUE。组内值都相同时,可以用 MAX 或 MIN 代替。
COLLECT_LISTCOLLECT_LIST(expr[, max_size])需改写 ARRAY_AGG(expression)没有 COLLECT_LIST,用 ARRAY_AGG。
COLLECT_SETCOLLECT_SET(expr[, max_size])需改写 ARRAY_AGG(DISTINCT expression)没有 COLLECT_SET,用 ARRAY_AGG。不支持 JSON、JSONB、INTERVAL 和数组等类型。
DATE_ADDDATE_ADD(date, INTERVAL n DAY)需改写 DATEADD(d, num, 'day')文档中没有 DATE_ADD,可以用 DATEADD 或 d + interval。DATEADD 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。
DATE_FORMATDATE_FORMAT(date, '%Y-%m-%d %H:%i:%s')需改写 TO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS')文档中没有 DATE_FORMAT,用 TO_CHAR 代替。格式符是 PostgreSQL 风格,HH 默认是 12 小时制,24 小时制要写 HH24。
DATE_SUBDATE_SUB(date, INTERVAL n DAY)需改写 d - interval '1 day'文档中没有 DATE_SUB。可以用日期减 interval,也可以写 DATEADD(d, -n, 'dd')。DATEADD 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。
DATEADDTIMESTAMPADD(unit, n, datetime_expr)支持 DATEADD(d, num, str)需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。单位写法与 MaxCompute 一致,包括 yyyy、mm、dd、hh、mi、ss。默认只支持 1925~2282 年,并且暂不支持常量入参写入。
DAYOFWEEKDAYOFWEEK(date)需改写 EXTRACT(DOW FROM ts) + 1DOW 以周日为 0,所以要加 1 才和其他引擎一致。ISODOW 以周一为 1、周日为 7。
EXPLODELATERAL VIEW EXPLODE(arr) t AS x需改写 UNNEST(anyarray)把数组的每个元素展开成一行。
FROM_JSONJSON_PARSE(json_str)需改写 json_str::jsonb ->> 'key'没有 FROM_JSON。先转成 JSON 或 JSONB,再用 -> 或 ->> 取字段,->> 返回 TEXT。需要展开成多列时可以用 json_populate_record。
FROM_UNIXTIMEFROM_UNIXTIME(unix_timestamp[, string_format])需改写 TO_TIMESTAMP(seconds)文档中没有 FROM_UNIXTIME。TO_TIMESTAMP(double precision) 按秒转换,返回 TIMESTAMPTZ。需要字符串时再用 TO_CHAR。
GET_JSON_OBJECTGET_JSON_STRING(json_str, json_path)支持 GET_JSON_OBJECT(json, json_path)属于 hive_compatible 扩展,使用前需要先执行 CREATE EXTENSION。
INSTRINSTR(str, substr)需改写 STRPOS(str, substr)INSTR 是 Oracle 兼容函数,需要先安装 orafce 扩展才能用,支持起始位置和第 N 次出现。不装扩展时用 STRPOS。
LENGTHCHAR_LENGTH(str)支持 LENGTH(str)按 UTF-8 字符计数,一个汉字、数字或字母都算 1,结果与 CHAR_LENGTH 相同。字节数用 OCTET_LENGTH。
MONTHS_BETWEENMONTHS_BETWEEN(end, start[, round_type])需改写 (EXTRACT(YEAR FROM a) - EXTRACT(YEAR FROM b)) * 12 + EXTRACT(MONTH FROM a) - EXTRACT(MONTH FROM b)日期函数中没有 MONTHS_BETWEEN,可以用 EXTRACT 取年和月计算整数月差,不含小数部分。
NVLNVL(expr1, expr2)需改写 COALESCE(value, default_value)条件函数文档中没有 NVL,只有 COALESCE、IF、NULLIF 等,需要改写为 COALESCE。
PERCENTILE_APPROXPERCENTILE_APPROX(col, p[, compression])需改写 APPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col)Hologres V3.1 起提供,用蓄水池抽样计算,最多保留 8,192 个元素。p 是 0~1 之间的常量。
REGEXP_EXTRACTREGEXP_EXTRACT(str, pattern, pos)需改写 (REGEXP_MATCH(str, pattern))[n]字符串函数中没有 REGEXP_EXTRACT。REGEXP_MATCH 返回由各分组组成的数组,再用数组下标取第 n 组,下标从 1 开始。
SIZEARRAY_SIZE(arr) / MAP_SIZE(m)需改写 ARRAY_LENGTH(arr, 1)第二个参数是维度,从 1 开始,一维数组传 1。数组函数文档只覆盖 ARRAY。
SPLITSPLIT_BY_STRING(str, separator)需改写 REGEXP_SPLIT_TO_ARRAY(str, pattern)字符串函数中没有 SPLIT。拆成数组用 REGEXP_SPLIT_TO_ARRAY,只取第 n 段用 SPLIT_PART(str, delimiter, n)。
STR_TO_MAPSTR_TO_MAP(str[, pair_delimiter[, key_value_delimiter]])不支持 字符串函数中没有 STR_TO_MAP。
SUBSTRING_INDEXSUBSTRING_INDEX(content, delimiter, field)不支持 字符串函数中没有 SUBSTRING_INDEX。只取某一段时可以用 SPLIT_PART。
TO_CHARDATE_FORMAT(date, '%Y-%m-%d %H:%i:%s')支持 TO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS')格式符沿用 PostgreSQL 风格。HH 默认是 12 小时制,24 小时制要写 HH24。默认只支持 1925~2282 年。
TO_DATEstr_to_date(str, format)支持 TO_DATE(text, format)PostgreSQL 风格格式符,例如 YYYY-MM-DD。文档写的返回类型是 TEXT,但示例结果是日期,建议实测。
UNIX_TIMESTAMPUNIX_TIMESTAMP([date[, fmt]])需改写 EXTRACT(EPOCH FROM ts)日期函数中没有 UNIX_TIMESTAMP。EXTRACT 的 epoch 字段返回秒数,类型是 DOUBLE PRECISION。
WEEKOFYEARWEEKOFYEAR(date)需改写 EXTRACT(WEEK FROM ts)也可以用 week_iso(ts),文档说明语义与 EXTRACT(WEEK FROM ts) 相同、性能更好。返回 DOUBLE PRECISION。
WM_CONCATGROUP_CONCAT([DISTINCT] str[, sep] [ORDER BY ...])需改写 STRING_AGG(expression, delimiter)分隔符写在后面,只拼接非 NULL 值。

迁移注意事项

以下内容摘自各函数页中提到 Doris 或 Hologres 的注意事项。

ADD_MONTHS 按月加减

ANY_VALUE 取组内任意值

COLLECT_LIST 聚合为数组

COLLECT_SET 去重聚合为数组

DATE_FORMAT 日期格式化

DATE_SUB 日期减天数

DATEADD 按单位加减日期

DAYOFWEEK 星期几

EXPLODE 数组展开为多行

FROM_JSON 按 schema 解析 JSON

FROM_UNIXTIME 时间戳转日期

GET_JSON_OBJECT 提取 JSON 字段

INSTR 查找子串位置

LENGTH 字符串长度

MONTHS_BETWEEN 相差月数

NVL 空值替换

PERCENTILE_APPROX 近似分位数

REGEXP_EXTRACT 正则提取

SIZE 数组和 Map 元素个数

SPLIT 字符串拆分

STR_TO_MAP 字符串转 Map

SUBSTRING_INDEX 按分隔符截取

TO_CHAR 日期转字符串

TO_DATE 字符串转日期

UNIX_TIMESTAMP 日期转时间戳

WEEKOFYEAR 一年中的第几周

WM_CONCAT 分组拼接字符串

可以直接用的函数

下面 16 个函数在两个引擎中写法相同。参数、返回值和边界情况仍可能不同,点开函数页查看细节。

相关页面:Doris 函数写法 · Hologres 函数写法 · 全部迁移清单 · 用 SQL 迁移检查器检查自己的 SQL