数仓 SQL 函数对照

首页 / StarRocks

StarRocks 函数写法

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

函数用途支持写法说明
ADD_MONTHS 按月加减 支持 add_months(date, months) 返回 DATETIME,DATE 输入也会转成 DATETIME。目标月份没有对应日期时返回当月最后一天,例如 2022-01-31 加 1 个月得到 2022-02-28。
ANY_VALUE 取组内任意值 支持 ANY_VALUE(expr) 返回值不确定。3.2 起支持 ARRAY、MAP 和 STRUCT 类型。
COLLECT_LIST 聚合为数组 需改写 ARRAY_AGG(col [ORDER BY ...]) 在 StarRocks 文档中搜索不到 COLLECT_LIST。ARRAY_AGG 会保留 NULL,3.0 起支持 ORDER BY 指定元素顺序。
COLLECT_SET 去重聚合为数组 需改写 ARRAY_AGG(DISTINCT col) 在 StarRocks 文档中搜索不到 COLLECT_SET。ARRAY_AGG_DISTINCT 是 ARRAY_AGG(DISTINCT) 的别名。ARRAY_AGG 会保留 NULL。
CONCAT 字符串拼接 支持 concat(str, ...) 任一参数为 NULL 时返回 NULL。
CONCAT_WS 按分隔符拼接 支持 concat_ws(sep, str, ...) 分隔符为 NULL 时返回 NULL。NULL 值会被跳过,空字符串不会被跳过。
DATE_ADD 日期加减 支持 DATE_ADD(date, INTERVAL n DAY) 文档只列出 INTERVAL 写法。返回 DATETIME,DATE 输入也会转成 DATETIME。结果日期不存在时返回 NULL。
DATE_FORMAT 日期格式化 支持 DATE_FORMAT(datetime, '%Y-%m-%d %H:%i:%s') MySQL 风格格式符,%m 是月,%i 是分钟。需要 yyyy-MM-dd 这类 Joda 风格时用 jodatime_format。结果超过 128 字节时返回 NULL。
DATEDIFF 日期差 支持 DATEDIFF(expr1, expr2) 结果为 expr1 减 expr2,只按天计算,忽略时间部分。需要其他单位时用 date_diff。
DATETRUNC 日期截断 需改写 date_trunc('month', datetime) 单位在前且必须是常量。DATE 输入只能截断到 year、quarter、month、week、day。
EXPLODE 数组展开为多行 需改写 FROM t, UNNEST(arr) AS u(x) UNNEST 是表函数,配合横向连接使用,不需要写 LATERAL。NULL 或空数组不输出行;3.2.7 起可以用 LEFT JOIN ... ON TRUE 保留这些行。
FROM_UNIXTIME 时间戳转日期 支持 from_unixtime(unix_timestamp[, string_format]) 返回 VARCHAR,默认格式 yyyy-MM-dd HH:mm:ss。小于 0 或大于 253402243199 时返回 NULL。
GET_JSON_OBJECT 提取 JSON 字段 支持 get_json_object(json_str, json_path) 文档中 get_json_string 和 get_json_object 是同一条目,返回字符串。需要保留 JSON 类型时用 json_query 或箭头操作符。
IF 条件判断 支持 if(expr1, expr2, expr3) expr1 必须是 BOOLEAN,expr2 和 expr3 类型要兼容,返回类型与 expr2 相同。
LAST_DAY 当月最后一天 支持 last_day(date[, unit]) 3.1 起提供,返回 DATE。unit 可以是 month、quarter 或 year,默认 month。
MAX_BY 取最大值对应的列 支持 max_by(x, y) 2.5 起提供。y 为 NULL 的行被忽略,并列时返回最先遇到的 x。y 不能是 bitmap、hll 等不可排序的类型。
MAX_PT 取最新分区 不支持 — 在 StarRocks 官方文档中搜索不到 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。
NVL 空值替换 需改写 IFNULL(expr1, expr2) 条件函数列表中没有 NVL,只有 case、coalesce、if、ifnull 和 nullif。IFNULL 的结果类型与 expr1 一致。
REGEXP_REPLACE 正则替换 支持 regexp_replace(str, pattern, repl) 示例显示会替换全部匹配,可以用 \1 引用分组。
SPLIT 字符串拆分 支持 split(content, delimiter) 返回 ARRAY<VARCHAR>。分隔符为空字符串时按单个字符拆分。文档没有说明分隔符是否按正则处理。
SUBSTR 截取子串 支持 substr(str, pos[, len]) substr 和 substring 是同一个函数。从 1 开始计数,负数从末尾倒数,pos 为 0 或超出长度时返回空字符串。
TO_DATE 字符串转日期 需改写 str_to_date(str, format) StarRocks 的 to_date 只接受 DATETIME 并取日期部分,不能解析字符串。按格式解析用 str_to_date,格式符与 date_format 相同;格式只含日期时返回 DATE,否则返回 DATETIME。
UNIX_TIMESTAMP 日期转时间戳 支持 UNIX_TIMESTAMP([date[, fmt]]) 返回 BIGINT。fmt 用 %Y-%m-%d 风格。早于 1970-01-01 或晚于 2038-01-19 11:14:07 时返回 0,结果受时区影响。
WM_CONCAT 分组拼接字符串 需改写 GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR sep]) 默认分隔符是逗号,跳过 NULL。结果长度受 group_concat_max_len 限制,默认 1,024 个字符,超出部分会被截断。