SQL 方言通

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

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

从 Hologres 迁移到 Doris 时,在 Hologres 有对应写法的 43 个常用函数中,21 个需要改写(其中 1 个在 Doris 没有对应函数),另有 6 个可以改用 Doris 的原生函数。逐个列出两边写法和注意事项。

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

需要改写的函数

函数Hologres 写法Doris 写法Doris 说明
ADD_MONTHSd + interval '1 month'需改写 MONTHS_ADD(date, nums)文档没有列出 ADD_MONTHS 别名。返回类型与输入相同,2020-01-31 加 1 个月得到 2020-02-29。
COLLECT_LISTARRAY_AGG(expression)支持 COLLECT_LIST(expr[, max_size])别名 GROUP_ARRAY,会丢弃 NULL,max_size 限制数组长度。
COLLECT_SETARRAY_AGG(DISTINCT expression)支持 COLLECT_SET(expr[, max_size])别名 GROUP_UNIQ_ARRAY。会过滤 NULL,max_size 限制数组长度。
DATE_ADDDATEADD(d, num, 'day')支持 DATE_ADD(date, INTERVAL n DAY)别名有 days_add 和 adddate。单位支持 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。
DATE_FORMATTO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS')支持 DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s')MySQL 风格格式符,%m 是月,%i 是分钟。文档还列出 yyyyMMdd、yyyy-MM-dd 和 yyyy-MM-dd HH:mm:ss 三种格式。结果超过 128 字节时返回 NULL。
DATE_SUBd - interval '1 day'支持 DATE_SUB(date, INTERVAL n DAY)别名有 days_sub 和 subdate。单位支持 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。
DATEADDDATEADD(d, num, str)需改写 TIMESTAMPADD(unit, n, datetime_expr)单位常用 SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、YEAR。参数无效时返回 NULL。也可以写 DATE_ADD(dt, INTERVAL n unit)。
EXPLODEUNNEST(anyarray)支持 LATERAL VIEW EXPLODE(arr) t AS x通常配合 LATERAL VIEW 使用。EXPLODE 对空数组和 NULL 不输出行,EXPLODE_OUTER 会保留一行 NULL。
FROM_JSONjson_str::jsonb ->> 'key'需改写 JSON_PARSE(json_str)没有 FROM_JSON。JSON_PARSE 遇到非法 JSON 会报错;希望返回 NULL 时用 JSON_PARSE_ERROR_TO_NULL。取字段用 JSON_EXTRACT 系列函数。
FROM_UNIXTIMETO_TIMESTAMP(seconds)支持 FROM_UNIXTIME(unix_timestamp[, string_format])格式可以写 %Y-%m-%d %H:%i:%s,也可以写 yyyy-MM-dd HH:mm:ss。超出 0~32536771199 时返回 NULL。
GET_JSON_OBJECTGET_JSON_OBJECT(json, json_path)需改写 GET_JSON_STRING(json_str, json_path)路径以 $ 开头,不能包含双引号和方括号字符,含点号的键要用双引号括起来。官方建议改用 jsonb 类型和 jsonb_extract 系列函数。
INSTRSTRPOS(str, substr)支持 INSTR(str, substr)区分大小写,按 UTF-8 字符计算位置。找不到时返回 0,substr 为空串时返回 1,任一参数为 NULL 时返回 NULL。
LENGTHLENGTH(str)需改写 CHAR_LENGTH(str)LENGTH 返回 UTF-8 编码下的字节数,别名 OCTET_LENGTH。按字符计数要用 CHAR_LENGTH,别名 CHARACTER_LENGTH。
MAX_PTMAX_PT('table_name')不支持 在 Doris 官方文档中搜索不到 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。
PERCENTILE_APPROXAPPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col)支持 PERCENTILE_APPROX(col, p[, compression])p 必须是 0~1 的常量。compression 取 2048~10000。只统计非 NULL 值,组内没有有效数据时返回 NULL。
REGEXP_EXTRACT(REGEXP_MATCH(str, pattern))[n]支持 REGEXP_EXTRACT(str, pattern, pos)pos 是必填参数。没有匹配时返回空字符串。默认使用 RE2 正则语法,不支持零宽断言;把会话变量 enable_extended_regex 设为 true 后才支持。
SIZEARRAY_LENGTH(arr, 1)别名 ARRAY_SIZE(arr) / MAP_SIZE(m)数组用 ARRAY_SIZE,NULL 元素也计入,输入为 NULL 时返回 NULL。Map 用 MAP_SIZE,NULL 键和值都计入。
SPLITREGEXP_SPLIT_TO_ARRAY(str, pattern)需改写 SPLIT_BY_STRING(str, separator)返回字符串数组,任一参数为 NULL 时返回 NULL。分隔符为空字符串时按字节拆分。
TO_CHARTO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS')需改写 DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s')没有 TO_CHAR。DATE_FORMAT 使用 MySQL 风格格式符。
TO_DATETO_DATE(text, format)需改写 str_to_date(str, format)Doris 的 TO_DATE 只接受 DATETIME 并取日期部分。按格式解析用 STR_TO_DATE,返回 DATETIME,也接受 yyyyMMdd 等三种格式。
WM_CONCATSTRING_AGG(expression, delimiter)需改写 GROUP_CONCAT([DISTINCT] str[, sep] [ORDER BY ...])分隔符是第二个参数,默认是逗号加空格。DISTINCT 与 ORDER BY 同时使用从 2.1.6 起支持。

可以改用原生函数

下面的函数在 Hologres 中只能用替代写法,Doris 有对应的函数。原来的写法通常仍能运行,换成原生函数会更简洁。

函数Hologres 写法Doris 写法Doris 说明
ANY_VALUEMAX(col)支持 ANY_VALUE(expr)别名 ANY。组内有非 NULL 值时返回其中一个,全部为 NULL 时返回 NULL。
DAYOFWEEKEXTRACT(DOW FROM ts) + 1支持 DAYOFWEEK(date)别名 DOW。周日为 1,周六为 7,与 MySQL 的 dayofweek 一致。
MONTHS_BETWEEN(EXTRACT(YEAR FROM a) - EXTRACT(YEAR FROM b)) * 12 + EXTRACT(MONTH FROM a) - EXTRACT(MONTH FROM b)支持 MONTHS_BETWEEN(end, start[, round_type])与 Oracle 的 MONTHS_BETWEEN 一致。时间部分不参与计算;两个日期同为月末或日相同时返回整数。round_type 为 true 时保留 8 位小数。
NVLCOALESCE(value, default_value)支持 NVL(expr1, expr2)NVL 是 IFNULL 的别名。expr1 不为 NULL 时返回 expr1,否则返回 expr2。
UNIX_TIMESTAMPEXTRACT(EPOCH FROM ts)支持 UNIX_TIMESTAMP([date[, fmt]])fmt 用 %Y-%m-%d 风格。传入格式参数或带小数秒的输入时返回 DECIMAL;超出 1970~3001 年的范围时返回 0。结果受会话时区影响。
WEEKOFYEAREXTRACT(WEEK FROM ts)支持 WEEKOFYEAR(date)周一为一周的开始,一周中有 4 天及以上在当年时算作当年的周,返回 1~53,与 MySQL 的 weekofyear 一致。

迁移注意事项

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

ADD_MONTHS 按月加减

COLLECT_LIST 聚合为数组

COLLECT_SET 去重聚合为数组

DATE_FORMAT 日期格式化

DATE_SUB 日期减天数

DATEADD 按单位加减日期

EXPLODE 数组展开为多行

FROM_JSON 按 schema 解析 JSON

FROM_UNIXTIME 时间戳转日期

GET_JSON_OBJECT 提取 JSON 字段

INSTR 查找子串位置

LENGTH 字符串长度

PERCENTILE_APPROX 近似分位数

REGEXP_EXTRACT 正则提取

SIZE 数组和 Map 元素个数

SPLIT 字符串拆分

TO_CHAR 日期转字符串

TO_DATE 字符串转日期

WM_CONCAT 分组拼接字符串

ANY_VALUE 取组内任意值

DAYOFWEEK 星期几

MONTHS_BETWEEN 相差月数

NVL 空值替换

UNIX_TIMESTAMP 日期转时间戳

WEEKOFYEAR 一年中的第几周

可以直接用的函数

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

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