数仓 SQL 函数对照

首页 / MaxCompute

MaxCompute 函数写法

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

函数用途支持写法说明
COLLECT_LIST 聚合为数组 支持 COLLECT_LIST(colname) 值为 NULL 的行不参与计算,结果不保证顺序。官方建议拼接字符串时改用 WM_CONCAT。
COLLECT_SET 去重聚合为数组 支持 COLLECT_SET(colname) 返回去重后的数组,值为 NULL 的行不参与计算。
CONCAT 字符串拼接 支持 CONCAT(str1, str2[, ...]) 任一参数为 NULL 或没有参数时返回 NULL。也可以拼接数组,此时任一数组为 NULL 返回 NULL。
CONCAT_WS 按分隔符拼接 支持 CONCAT_WS(separator, str1, str2[, ...]) 也支持 CONCAT_WS(separator, array)。没有参数或任一参数为 NULL 时返回 NULL,不会跳过 NULL。
DATE_ADD 日期加减 支持 DATE_ADD(startdate, delta) 按天加减,delta 为负数时表示减。返回 DATE,输入的时间部分会被丢弃。需要按月、小时等单位加减时用 DATEADD。
DATE_FORMAT 日期格式化 支持 DATE_FORMAT(date, format) 返回 STRING。默认模式下分钟写 mi,写 mm 会输出月份;开启 Hive 兼容模式后分钟写 mm,写 mi 返回 NULL。DATE 和 STRING 输入需要开启 Hive 兼容模式。
DATEDIFF 日期差 支持 DATEDIFF(end_date, start_date[, date_part]) 结果为 end_date 减 start_date。不传 date_part 时按天计算并返回 INT,传入时返回 BIGINT。date_part 支持 yyyy、mm、dd、hh、mi、ss、ff3 等。
DATETRUNC 日期截断 支持 DATETRUNC(date, date_part) 返回类型与输入相同。单位支持 yyyy、q、mm、week、isoweek、dd、hh、mi、ss、ff3,week 默认从周一开始,也可以写 week(sunday)。
EXPLODE 数组展开为多行 支持 EXPLODE(var) 支持 array 和 map。同一个 SELECT 只能有一个 EXPLODE,也不能同时选其他列,不能与 GROUP BY 等一起使用。数组为 NULL 时不输出行。
FROM_UNIXTIME 时间戳转日期 支持 FROM_UNIXTIME(unixtime) 输入为秒,返回 DATETIME。默认只接受一个参数;开启 Hive 兼容模式后可以传第二个参数指定格式。
GET_JSON_OBJECT 提取 JSON 字段 支持 GET_JSON_OBJECT(json, json_path) 返回 STRING,路径以 $ 开头,不支持正则。转义行为受 odps.sql.udf.getjsonobj.new 控制。
IF 条件判断 支持 IF(testCondition, valueTrue, valueFalseOrNull) 条件为 NULL 时按 FALSE 处理,返回第三个参数。第二、三个参数的类型必须一致。
MAX_PT 取最新分区 支持 MAX_PT(table_full_name) 按字母顺序返回有数据的最大一级分区,只看一级分区。OSS 外部表也支持。所有分区都为空时会报错。
NVL 空值替换 支持 NVL(value, default_value) 文档要求两个参数的数据类型一致。
SPLIT 字符串拆分 支持 SPLIT(source, delimiter[, trimTailEmpty]) 返回 ARRAY<STRING>。分隔符支持正则表达式。trimTailEmpty 默认为 true,会去掉末尾的空字符串。任一参数为 NULL 时返回 NULL。
SUBSTR 截取子串 支持 SUBSTR(str, start_position[, length]) 从 1 开始计数,负数从末尾倒数。start_position 为 0 时返回空字符串;Hive 兼容模式和 BigQuery 兼容模式下按 1 处理。length 为 0 或负数时返回空字符串。
TO_DATE 字符串转日期 支持 TO_DATE(date_str[, format]) 不传 format 时返回 DATE,传入 format 时返回 DATETIME。格式符为 yyyy、mm、dd、hh、mi、ss、ff3,format 必须包含 yyyy。
WM_CONCAT 分组拼接字符串 支持 WM_CONCAT(separator, colname) 分隔符必须是常量且写在前面。支持 DISTINCT 和 WITHIN GROUP (ORDER BY ...),值为 NULL 的行不参与计算。