SQL 方言通

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

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

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

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

需要改写的函数

函数Hologres 写法StarRocks 写法StarRocks 说明
ADD_MONTHSd + interval '1 month'支持 add_months(date, months)返回 DATETIME,DATE 输入也会转成 DATETIME。目标月份没有对应日期时返回当月最后一天,例如 2022-01-31 加 1 个月得到 2022-02-28。
DATE_ADDDATEADD(d, num, 'day')支持 DATE_ADD(date, INTERVAL n DAY)文档只列出 INTERVAL 写法。返回 DATETIME,DATE 输入也会转成 DATETIME。结果日期不存在时返回 NULL。
DATE_FORMATTO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS')支持 DATE_FORMAT(datetime, '%Y-%m-%d %H:%i:%s')MySQL 风格格式符,%m 是月,%i 是分钟。需要 yyyy-MM-dd 这类 Joda 风格时用 jodatime_format。结果超过 128 字节时返回 NULL。
DATE_SUBd - interval '1 day'支持 DATE_SUB(date, INTERVAL n DAY)别名 subdate。返回 DATETIME。结果日期不存在时返回 NULL,例如 2010-02-30。只传天数时可以用 days_sub(d, n)。
DATEADDDATEADD(d, num, str)需改写 TIMESTAMPADD(unit, n, datetime_expr)单位写成关键字,例如 HOUR、DAY、MONTH,不加引号。TIMESTAMPADD 文档没有列出 QUARTER;按季度加减可以用 DATE_ADD(dt, INTERVAL n QUARTER)。
FROM_JSONjson_str::jsonb ->> 'key'需改写 parse_json(str)没有 FROM_JSON。parse_json 返回 JSON 类型,而不是 STRUCT 或 MAP。字符串不是合法 JSON 时返回 NULL。取字段可以接 json_query 或 -> 运算符。
FROM_UNIXTIMETO_TIMESTAMP(seconds)支持 from_unixtime(unix_timestamp[, string_format])返回 VARCHAR,默认格式 yyyy-MM-dd HH:mm:ss。小于 0 或大于 253402243199 时返回 NULL。
INSTRSTRPOS(str, substr)支持 instr(str, substr)按字符计数,下标从 1 开始,找不到时返回 0。需要指定起始位置时用 locate(substr, str, pos)。
LENGTHLENGTH(str)需改写 char_length(str)LENGTH 返回的是字节数。按字符计数要用 char_length,别名 character_length,目前只支持 UTF-8。
MAX_PTMAX_PT('table_name')不支持 在 StarRocks 官方文档中搜索不到 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。
MONTHS_BETWEEN(EXTRACT(YEAR FROM a) - EXTRACT(YEAR FROM b)) * 12 + EXTRACT(MONTH FROM a) - EXTRACT(MONTH FROM b)需改写 months_diff(expr1, expr2)函数列表中没有 MONTHS_BETWEEN。months_diff 返回 expr1 减 expr2 的月数,类型是 BIGINT,只精确到月;日期不存在时返回 NULL。
NVLCOALESCE(value, default_value)需改写 IFNULL(expr1, expr2)条件函数列表中没有 NVL,只有 case、coalesce、if、ifnull 和 nullif。IFNULL 的结果类型与 expr1 一致。
PERCENTILE_APPROXAPPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col)支持 PERCENTILE_APPROX(expr, p[, compression])p 可以是单个值或数组。compression 取 2048~10000,不传或超出范围时按 10000 计算,值越大越精确,内存占用也越多。
REGEXP_EXTRACT(REGEXP_MATCH(str, pattern))[n]支持 regexp_extract(str, pattern, pos)pos 是必填参数。没有匹配时返回空字符串。
SPLITREGEXP_SPLIT_TO_ARRAY(str, pattern)支持 split(content, delimiter)返回 ARRAY<VARCHAR>。分隔符为空字符串时按单个字符拆分。文档没有说明分隔符是否按正则处理。
TO_CHARTO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS')需改写 DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s')没有 TO_CHAR。DATE_FORMAT 使用 MySQL 风格格式符,%i 表示分钟。结果超过 128 字节时返回 NULL。
TO_DATETO_DATE(text, format)需改写 str_to_date(str, format)StarRocks 的 to_date 只接受 DATETIME 并取日期部分,不能解析字符串。按格式解析用 str_to_date,格式符与 date_format 相同;格式只含日期时返回 DATE,否则返回 DATETIME。
WM_CONCATSTRING_AGG(expression, delimiter)需改写 GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR sep])默认分隔符是逗号,跳过 NULL。结果长度受 group_concat_max_len 限制,默认 1,024 个字符,超出部分会被截断。

可以改用原生函数

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

函数Hologres 写法StarRocks 写法StarRocks 说明
ANY_VALUEMAX(col)支持 ANY_VALUE(expr)返回值不确定。3.2 起支持 ARRAY、MAP 和 STRUCT 类型。
DAYOFWEEKEXTRACT(DOW FROM ts) + 1支持 dayofweek(date)周日为 1,周一为 2,周六为 7。
SUBSTRSUBSTRING(str FROM start FOR len)支持 substr(str, pos[, len])substr 和 substring 是同一个函数。从 1 开始计数,负数从末尾倒数,pos 为 0 或超出长度时返回空字符串。
UNIX_TIMESTAMPEXTRACT(EPOCH FROM ts)支持 UNIX_TIMESTAMP([date[, fmt]])返回 BIGINT。fmt 用 %Y-%m-%d 风格。早于 1970-01-01 或晚于 2038-01-19 11:14:07 时返回 0,结果受时区影响。
WEEKOFYEAREXTRACT(WEEK FROM ts)支持 WEEKOFYEAR(date)返回 INT。文档没有说明周的划分规则;需要 ISO 周时可以用 week_iso。

迁移注意事项

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

ADD_MONTHS 按月加减

DATE_ADD 日期加减

DATE_FORMAT 日期格式化

DATE_SUB 日期减天数

DATEADD 按单位加减日期

FROM_JSON 按 schema 解析 JSON

FROM_UNIXTIME 时间戳转日期

INSTR 查找子串位置

LENGTH 字符串长度

MONTHS_BETWEEN 相差月数

NVL 空值替换

PERCENTILE_APPROX 近似分位数

REGEXP_EXTRACT 正则提取

SPLIT 字符串拆分

TO_CHAR 日期转字符串

TO_DATE 字符串转日期

WM_CONCAT 分组拼接字符串

DAYOFWEEK 星期几

SUBSTR 截取子串

UNIX_TIMESTAMP 日期转时间戳

WEEKOFYEAR 一年中的第几周

可以直接用的函数

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

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