数仓 SQL 函数对照

首页 / Doris

Doris 函数写法

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

函数用途支持写法说明
COLLECT_LIST 聚合为数组 支持 COLLECT_LIST(expr[, max_size]) 别名 GROUP_ARRAY,会丢弃 NULL,max_size 限制数组长度。
COLLECT_SET 去重聚合为数组 支持 COLLECT_SET(expr[, max_size]) 别名 GROUP_UNIQ_ARRAY。会过滤 NULL,max_size 限制数组长度。
CONCAT 字符串拼接 支持 CONCAT(expr[, expr ...]) 任一参数为 NULL 时返回 NULL。
CONCAT_WS 按分隔符拼接 支持 CONCAT_WS(sep, str[, str]) 也支持 CONCAT_WS(sep, array)。分隔符为 NULL 时返回 NULL,NULL 值会被跳过,空字符串不会。
DATE_ADD 日期加减 支持 DATE_ADD(date, INTERVAL n DAY) 别名有 days_add 和 adddate。单位支持 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。
DATE_FORMAT 日期格式化 支持 DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s') MySQL 风格格式符,%m 是月,%i 是分钟。文档还列出 yyyyMMdd、yyyy-MM-dd 和 yyyy-MM-dd HH:mm:ss 三种格式。结果超过 128 字节时返回 NULL。
DATEDIFF 日期差 支持 DATEDIFF(expr1, expr2) 结果为 expr1 减 expr2,按天计算。
DATETRUNC 日期截断 需改写 DATE_TRUNC(datetime, 'month') 文档列出两种参数顺序,示例都是日期在前。
EXPLODE 数组展开为多行 支持 LATERAL VIEW EXPLODE(arr) t AS x 通常配合 LATERAL VIEW 使用。EXPLODE 对空数组和 NULL 不输出行,EXPLODE_OUTER 会保留一行 NULL。
FROM_UNIXTIME 时间戳转日期 支持 FROM_UNIXTIME(unix_timestamp[, string_format]) 格式可以写 %Y-%m-%d %H:%i:%s,也可以写 yyyy-MM-dd HH:mm:ss。超出 0~32536771199 时返回 NULL。
GET_JSON_OBJECT 提取 JSON 字段 需改写 GET_JSON_STRING(json_str, json_path) 路径以 $ 开头,不能包含双引号和方括号字符,含点号的键要用双引号括起来。官方建议改用 jsonb 类型和 jsonb_extract 系列函数。
IF 条件判断 支持 IF(condition, value_true, value_false_or_null)
MAX_PT 取最新分区 不支持 — 在 Doris 官方文档中搜索不到 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。
NVL 空值替换 支持 NVL(expr1, expr2) NVL 是 IFNULL 的别名。expr1 不为 NULL 时返回 expr1,否则返回 expr2。
SPLIT 字符串拆分 需改写 SPLIT_BY_STRING(str, separator) 返回字符串数组,任一参数为 NULL 时返回 NULL。分隔符为空字符串时按字节拆分。
SUBSTR 截取子串 支持 SUBSTRING(str, pos[, len]) 别名 SUBSTR。从 1 开始计数,负数从末尾倒数,pos 为 0 或超出长度时返回空字符串,任一参数为 NULL 时返回 NULL。
TO_DATE 字符串转日期 需改写 str_to_date(str, format) Doris 的 TO_DATE 只接受 DATETIME 并取日期部分。按格式解析用 STR_TO_DATE,返回 DATETIME,也接受 yyyyMMdd 等三种格式。
WM_CONCAT 分组拼接字符串 需改写 GROUP_CONCAT([DISTINCT] str[, sep] [ORDER BY ...]) 分隔符是第二个参数,默认是逗号加空格。DISTINCT 与 ORDER BY 同时使用从 2.1.6 起支持。