首页 / 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 个字符,超出部分会被截断。 |