数仓 SQL 函数对照

首页 / Flink SQL

Flink SQL 函数写法

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

函数用途支持写法说明
ADD_MONTHS 按月加减 需改写 TIMESTAMPADD(MONTH, n, timepoint) 内置函数中没有 ADD_MONTHS,用 TIMESTAMPADD 的 MONTH 单位。
ANY_VALUE 取组内任意值 需改写 FIRST_VALUE(expression) 内置函数中没有 ANY_VALUE,可以用聚合函数 FIRST_VALUE 代替。
COLLECT_LIST 聚合为数组 需改写 ARRAY_AGG(expression) 没有输入行时返回 NULL,可以用 RESPECT NULLS 或 IGNORE NULLS 控制是否保留 NULL。
COLLECT_SET 去重聚合为数组 需改写 ARRAY_AGG(DISTINCT expression) 也可以用 COLLECT(DISTINCT expression),返回的是 MULTISET 而不是数组。
CONCAT 字符串拼接 支持 CONCAT(string1, string2, ...) 任一参数为 NULL 时返回 NULL。
CONCAT_WS 按分隔符拼接 支持 CONCAT_WS(string1, string2, string3, ...) 第一个参数是分隔符,为 NULL 时返回 NULL;其余参数中的 NULL 会被跳过。
DATE_ADD 日期加减 需改写 TIMESTAMPADD(DAY, n, timepoint) 内置函数中没有 DATE_ADD,改用 TIMESTAMPADD。
DATE_FORMAT 日期格式化 支持 DATE_FORMAT(timestamp, format) 按格式字符串把 TIMESTAMP 转换为字符串。
DATEDIFF 日期差 需改写 TIMESTAMPDIFF(DAY, timepoint1, timepoint2) 内置函数中没有 DATEDIFF。TIMESTAMPDIFF 返回 timepoint1 与 timepoint2 之间带符号的单位数,先写单位,再写开始时间和结束时间。
DATETRUNC 日期截断 需改写 FLOOR(timepoint TO MONTH) 内置函数中没有 DATE_TRUNC,用 FLOOR ... TO 向下取整到指定单位。
EXPLODE 数组展开为多行 需改写 CROSS JOIN UNNEST(arr) AS t(x) 内置函数中没有 EXPLODE,数组展开写在 JOIN 中:CROSS JOIN UNNEST,也支持 LEFT JOIN。需要元素位置时加 WITH ORDINALITY,位置从 1 开始,目前只支持 CROSS JOIN。也可以展开 map 和 multiset。
FROM_UNIXTIME 时间戳转日期 支持 FROM_UNIXTIME(numeric[, string]) 返回字符串,默认格式 yyyy-MM-dd HH:mm:ss,结果按会话时区表示。
GET_JSON_OBJECT 提取 JSON 字段 需改写 JSON_VALUE(json, path) 提取 JSON 中的标量值,可以用 RETURNING 子句指定返回类型。
IF 条件判断 支持 IF(condition, true_value, false_value)
LAST_DAY 当月最后一天 需改写 TIMESTAMPADD(DAY, -1, TIMESTAMPADD(MONTH, 1, FLOOR(ts TO MONTH))) 内置函数中没有 LAST_DAY。先用 FLOOR 取当月第一天,加一个月再减一天。
MAX_BY 取最大值对应的列 需改写 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1 内置函数中没有 MAX_BY 或 ARG_MAX,用 ROW_NUMBER 窗口函数改写。
MAX_PT 取最新分区 不支持 — 内置函数中没有 MAX_PT。流式作业没有“最新分区”的概念,批模式下可以用子查询改写。
NVL 空值替换 需改写 IFNULL(input, null_replacement) 没有 NVL,可以用 IFNULL 或 COALESCE。
REGEXP_REPLACE 正则替换 支持 REGEXP_REPLACE(string1, string2, string3) 替换全部匹配的子串。
SPLIT 字符串拆分 支持 SPLIT(string, delimiter) 字符串或分隔符为 NULL 时返回 NULL。只取第 n 段可以用 SPLIT_INDEX。
SUBSTR 截取子串 支持 SUBSTR(string, integer1[, integer2]) 也可以写 SUBSTRING。省略长度时截取到末尾。
TO_DATE 字符串转日期 支持 TO_DATE(string1[, string2]) 默认格式为 'yyyy-MM-dd'。
UNIX_TIMESTAMP 日期转时间戳 支持 UNIX_TIMESTAMP(string1[, string2]) 默认格式 yyyy-MM-dd HH:mm:ss。不带参数时返回当前时间的秒数。
WM_CONCAT 分组拼接字符串 需改写 LISTAGG(expression[, separator]) 分隔符写在后面。