文章目录
- 一、分类总览
- 1、函数分类
- 2、全部函数
- 二、条件判断类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 三、类型转换类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 四、NULL处理类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 五、压缩 / 校验 / Hash类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 六、身份证信息类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 七、账号 / 元数据判断类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 八、排序 / 采样类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 九、Map转换类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 十、行列转换类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 十一、随机ID类
- 1、定义
- 2、区别
- 3、简单记忆
- 4、案例
- 十二、最容易混淆的函数对比
- 十三、常用案例
- 1、NULL兜底
- 2、多级兜底
- 3、安全转换数字
- 4、最新分区
- 5、条件分类
- 6、生成Data ID
- 7、判断表是否存在
- 8、字符串转MAP
- 十四、参考资料
一、分类总览
1、函数分类
| 分类 | 主要解决的问题 | 代表函数 |
|---|---|---|
| 1、条件判断类 | 区间判断、条件分支、条件返回 | BETWEEN AND、CASE WHEN、IF、FAILIF |
| 2、类型转换类 | 数据类型转换和安全转换 | CAST、SAFE_CAST |
| 3、NULL处理类 | 空值兜底、相等转 NULL | COALESCE、NVL、NULLIF |
| 4、压缩 / 校验 / Hash类 | GZIP 压缩、CRC 校验、Hash、SHA | COMPRESS、DECOMPRESS、CRC32、HASH、SHA、SHA1、SHA2 |
| 5、身份证信息类 | 从身份证号码提取年龄、出生日期、性别 | GET_IDCARD_AGE、GET_IDCARD_BIRTHDAY、GET_IDCARD_SEX |
| 6、账号 / 元数据判断类 | 获取账号 ID,判断表或分区是否存在 | GET_USER_ID、TABLE_EXISTS、PARTITION_EXISTS、MAX_PT |
| 7、排序 / 采样类 | 取排序后指定位置值、数据采样 | ORDINAL、SAMPLE |
| 8、Map转换类 | 将字符串解析为 MAP | STR_TO_MAP |
| 9、行列转换类 | 一行拆多行、多列转多行 | STACK、TRANS_ARRAY、TRANS_COLS |
| 10、随机ID类 | 生成随机唯一标识 | UNIQUE_ID、UUID |
2、全部函数
| 分类 | 函数 | 功能 |
|---|---|---|
| 1、条件判断类 | BETWEEN AND | 判断数据是否落在指定区间内 |
| 1、条件判断类 | CASE WHEN | 按条件返回不同结果 |
| 1、条件判断类 | FAILIF | 条件满足时返回TRUE,否则触发自定义报错 |
| 1、条件判断类 | IF | 根据条件真假返回不同值 |
| 2、类型转换类 | CAST | 将表达式转换为目标数据类型 |
| 2、类型转换类 | SAFE_CAST | 尝试转换类型,失败时安全返回NULL |
| 3、NULL处理类 | COALESCE | 返回参数列表中第一个非NULL值 |
| 3、NULL处理类 | NULLIF | 两个参数相等时返回NULL |
| 3、NULL处理类 | NVL | 参数为NULL时返回替代值 |
| 4、压缩 / 校验 / Hash类 | COMPRESS | 使用GZIP压缩STRING或BINARY |
| 4、压缩 / 校验 / Hash类 | CRC32 | 计算字符串或二进制数据的 CRC32 校验值 |
| 4、压缩 / 校验 / Hash类 | DECOMPRESS | 使用GZIP解压BINARY |
| 4、压缩 / 校验 / Hash类 | HASH | 对输入参数计算 Hash 值 |
| 4、压缩 / 校验 / Hash类 | SHA | 计算SHA-1Hash 值 |
| 4、压缩 / 校验 / Hash类 | SHA1 | 计算SHA-1Hash 值 |
| 4、压缩 / 校验 / Hash类 | SHA2 | 计算SHA-2Hash 值 |
| 5、身份证信息类 | GET_IDCARD_AGE | 根据身份证号码计算当前年龄 |
| 5、身份证信息类 | GET_IDCARD_BIRTHDAY | 根据身份证号码返回出生日期 |
| 5、身份证信息类 | GET_IDCARD_SEX | 根据身份证号码返回性别 |
| 6、账号 / 元数据判断类 | GET_USER_ID | 获取当前账号的账号 ID |
| 6、账号 / 元数据判断类 | MAX_PT | 返回分区表一级分区的最大值 |
| 6、账号 / 元数据判断类 | PARTITION_EXISTS | 判断指定分区是否存在 |
| 6、账号 / 元数据判断类 | TABLE_EXISTS | 判断指定表是否存在 |
| 7、排序 / 采样类 | ORDINAL | 排序后返回指定位置的值 |
| 7、排序 / 采样类 | SAMPLE | 对数据进行采样并过滤未命中的行 |
| 8、Map转换类 | STR_TO_MAP | 按分隔符将字符串解析成MAP |
| 9、行列转换类 | STACK | 将一组参数拆分成指定行数 |
| 9、行列转换类 | TRANS_ARRAY | 将分隔符数组字符串拆成多行 |
| 9、行列转换类 | TRANS_COLS | 将不同列拆分成多行 |
| 10、随机ID类 | UNIQUE_ID | 返回高效随机 ID |
| 10、随机ID类 | UUID | 返回随机 ID |
二、条件判断类
| 函数 / 表达式 | 功能 |
|---|---|
BETWEEN AND | 判断是否位于区间 |
CASE WHEN | 多条件分支 |
IF | 二选一条件判断 |
FAILIF | 条件校验与主动报错 |
1、定义
BETWEEN AND:判断一个值是否位于指定闭区间。CASE WHEN:支持多个条件分支。IF:根据一个布尔条件返回两个结果之一。FAILIF:用于数据校验,不满足预期时可主动抛出错误。
2、区别
| 对比 | 区别 |
|---|---|
BETWEEN AND | 只判断区间 |
IF | 最适合简单二选一 |
CASE WHEN | 适合多条件、多分支 |
FAILIF | 主要用于数据校验和中断任务 |
IF与CASE WHEN:
两个结果二选一优先
IF;条件多、分支多优先CASE WHEN。
3、简单记忆
BETWEEN= 在不在区间。IF= 二选一。CASE WHEN= 多分支。FAILIF= 条件不符合就报错。
4、案例
-- 结果:trueSELECT1200BETWEEN1000AND1500;-- 结果:highSELECTCASEWHEN1200>=1000THEN'high'ELSE'low'END;-- 结果:highSELECTIF(1200>=1000,'high','low');-- 数据异常时主动报错SELECTFAILIF(order_cnt>=0,'order_cnt不能小于0')FROMsource_table;三、类型转换类
| 函数 | 功能 |
|---|---|
CAST | 强制类型转换 |
SAFE_CAST | 安全类型转换 |
1、定义
CAST:把表达式转换成指定目标类型,非法转换可能直接报错。SAFE_CAST:尝试转换,转换失败时返回NULL,而不是让 SQL 失败。
2、区别
| 对比 | 区别 |
|---|---|
CAST | 转换失败可能报错 |
SAFE_CAST | 转换失败返回NULL |
| 使用场景 | 数据质量可控用CAST;脏数据较多时SAFE_CAST更稳妥 |
3、简单记忆
CAST= 强转。SAFE_CAST= 转不了就NULL。
4、案例
-- 结果:123SELECTCAST('123'ASBIGINT);-- 结果:NULLSELECTSAFE_CAST('abc'ASBIGINT);四、NULL处理类
| 函数 | 功能 |
|---|---|
COALESCE | 多参数取第一个非 NULL |
NVL | NULL 时给默认值 |
NULLIF | 相等时变 NULL |
1、定义
COALESCE:从左到右返回第一个非NULL值。NVL:第一个参数为NULL时返回第二个参数。NULLIF:两个参数相等时返回NULL,否则返回第一个参数。
2、区别
| 对比 | 区别 |
|---|---|
COALESCE | 可传多个候选值 |
NVL | 主要是一个值 + 一个默认值 |
NULLIF | 不是填补 NULL,而是把某些值转换成 NULL |
3、简单记忆
COALESCE= 多选一,找第一个非空。NVL= 空了就兜底。NULLIF= 一样就置空。
4、案例
-- 结果:ASELECTCOALESCE(NULL,NULL,'A','B');-- 结果:0SELECTNVL(NULL,0);-- 结果:NULLSELECTNULLIF(100,100);五、压缩 / 校验 / Hash类
| 函数 | 功能 |
|---|---|
COMPRESS | GZIP 压缩 |
DECOMPRESS | GZIP 解压 |
CRC32 | CRC32 校验 |
HASH | 通用 Hash |
SHA | SHA-1 |
SHA1 | SHA-1 |
SHA2 | SHA-2 |
1、定义
这一类用于数据压缩、校验、散列和摘要计算。
2、区别
| 对比 | 区别 |
|---|---|
COMPRESS / DECOMPRESS | 压缩 / 解压,使用GZIP |
CRC32 | 更偏数据完整性校验 |
HASH | 通用散列,支持多个参数 |
SHA / SHA1 | 都计算SHA-1 |
SHA2 | 支持更强的SHA-2系列 |
需要注意:
Hash 值相同不代表输入一定相同,存在哈希碰撞可能。
3、简单记忆
COMPRESS压。DECOMPRESS解。CRC32校验。HASH通用散列。SHA / SHA1= SHA-1。SHA2= SHA-2。
4、案例
-- 返回 BINARY 压缩结果SELECTCOMPRESS('hello');-- 结果:hello, worldSELECTCAST(DECOMPRESS(COMPRESS('hello, world'))ASSTRING);-- 结果:2743272264SELECTCRC32('ABC');-- 返回 Hash 值SELECTHASH('A',100);-- 返回 SHA-1SELECTSHA('abc');-- 返回 SHA-1SELECTSHA1('abc');-- 返回 SHA-256SELECTSHA2('abc',256);六、身份证信息类
| 函数 | 功能 |
|---|---|
GET_IDCARD_AGE | 获取年龄 |
GET_IDCARD_BIRTHDAY | 获取出生日期 |
GET_IDCARD_SEX | 获取性别 |
1、定义
这三个函数都基于中国居民身份证号码进行解析,并会校验身份证合法性。
2、区别
| 函数 | 返回 |
|---|---|
GET_IDCARD_AGE | 当前年龄,BIGINT |
GET_IDCARD_BIRTHDAY | 出生日期,DATETIME |
GET_IDCARD_SEX | M或F,STRING |
如果身份证校验不通过,返回NULL。
3、简单记忆
AGE年龄。BIRTHDAY出生日期。SEX性别。
4、案例
-- 返回身份证对应年龄SELECTGET_IDCARD_AGE(idcard_no)FROMuser_table;-- 返回身份证对应出生日期SELECTGET_IDCARD_BIRTHDAY(idcard_no)FROMuser_table;-- 返回 M 或 FSELECTGET_IDCARD_SEX(idcard_no)FROMuser_table;七、账号 / 元数据判断类
| 函数 | 功能 |
|---|---|
GET_USER_ID | 当前账号 ID |
MAX_PT | 最大一级分区 |
PARTITION_EXISTS | 分区是否存在 |
TABLE_EXISTS | 表是否存在 |
1、定义
这一类主要用于获取当前账号信息,或在 SQL 中判断 MaxCompute 表、分区元数据。
2、区别
| 函数 | 使用场景 |
|---|---|
GET_USER_ID | 获取当前执行账号 |
MAX_PT | 获取表最大一级分区值 |
PARTITION_EXISTS | 判断具体分区是否存在 |
TABLE_EXISTS | 判断表是否存在 |
你日常使用最多的是:
MAX_PT('table_name')获取最新分区。
3、简单记忆
GET_USER_ID= 我是谁。MAX_PT= 最大分区。PARTITION_EXISTS= 分区在不在。TABLE_EXISTS= 表在不在。
4、案例
-- 返回当前账号 IDSELECTGET_USER_ID();-- 返回最大一级分区,例如 20260927SELECTMAX_PT('udi.src_shop_df');-- 判断指定分区是否存在SELECTPARTITION_EXISTS('udi.src_shop_df','ds=20260927');-- 判断表是否存在SELECTTABLE_EXISTS('udi.src_shop_df');八、排序 / 采样类
| 函数 | 功能 |
|---|---|
ORDINAL | 排序后取指定位置值 |
SAMPLE | 数据采样 |
1、定义
ORDINAL:将输入变量排序后返回指定位置的值。SAMPLE:按采样规则过滤输入数据。
2、区别
两个函数用途完全不同:
| 函数 | 主要用途 |
|---|---|
ORDINAL | 多个值中按大小取第 N 个 |
SAMPLE | 从大量数据中抽取部分记录 |
3、简单记忆
ORDINAL= 排序取位置。SAMPLE= 抽样。
4、案例
-- 从输入值排序后取指定位置SELECTORDINAL(2,10,30,20);-- 按采样条件过滤数据SELECT*FROMsource_tableWHERESAMPLE(10,1);九、Map转换类
| 函数 | 功能 |
|---|---|
STR_TO_MAP | STRING 转 MAP |
1、定义
STR_TO_MAP将带固定 Key-Value 分隔格式的字符串解析为MAP。
例如:
a:1,b:2,c:3可以转成:
{a:1,b:2,c:3}2、区别
与MAP函数相比:
| 函数 | 区别 |
|---|---|
MAP | 已经有独立 Key、Value 时直接构造 |
STR_TO_MAP | 原始数据是一个完整字符串,需要先解析 |
3、简单记忆
STR_TO_MAP= String → Map。
4、案例
-- 结果:{a:1,b:2,c:3}SELECTSTR_TO_MAP('a:1,b:2,c:3',',',':')ASresult;十、行列转换类
| 函数 | 功能 |
|---|---|
STACK | 参数组拆成多行 |
TRANS_ARRAY | 分隔字符串拆成多行 |
TRANS_COLS | 多列转多行 |
1、定义
这一类都用于改变数据的行列形态。
STACK:把指定参数组拆成固定行数。TRANS_ARRAY:把列中以分隔符保存的数组字符串拆为多行。TRANS_COLS:把多个不同列转换成多行。
2、区别
| 对比 | 区别 |
|---|---|
STACK | 静态参数组转多行 |
TRANS_ARRAY | 一个字符串列内部拆多行 |
TRANS_COLS | 多个列转成多行 |
3、简单记忆
STACK= 堆成多行。TRANS_ARRAY= 字符串数组拆行。TRANS_COLS= 列转行。
4、案例
-- 结果:拆成 2 行SELECTSTACK(2,'A',100,'B',200);-- 将逗号分隔字段拆成多行SELECTTRANS_ARRAY(2,',',shop_id,tag_list)FROMshop_table;-- 将多个指标列转换成多行SELECTTRANS_COLS(2,metric_a,metric_b)FROMsource_table;十一、随机ID类
| 函数 | 功能 |
|---|---|
UNIQUE_ID | 高效随机 ID |
UUID | 随机 ID |
1、定义
UNIQUE_ID:返回随机 ID,官方说明运行效率高于UUID。UUID:返回随机 UUID。
2、区别
| 对比 | 区别 |
|---|---|
UNIQUE_ID | 更偏高性能唯一标识生成 |
UUID | 标准随机 UUID,日常使用更直观 |
| 性能 | 官方说明UNIQUE_ID高于UUID |
3、简单记忆
只要随机 ID:
UUID。
更关注执行效率:UNIQUE_ID。
4、案例
-- 返回随机 IDSELECTUNIQUE_ID();-- 返回随机 UUIDSELECTUUID();十二、最容易混淆的函数对比
| 函数组合 | 最核心区别 |
|---|---|
IFvsCASE WHEN | 简单二选一 vs 多条件分支 |
CASTvsSAFE_CAST | 失败可能报错 vs 失败返回 NULL |
NVLvsCOALESCE | 两参数兜底 vs 多参数取第一个非 NULL |
NVLvsNULLIF | NULL 补值 vs 指定值转 NULL |
COMPRESSvsDECOMPRESS | GZIP 压缩 vs GZIP 解压 |
CRC32vsHASH | 校验值 vs 通用散列 |
SHAvsSHA1 | 都是 SHA-1 |
SHA1vsSHA2 | SHA-1 vs SHA-2 |
MAX_PTvsPARTITION_EXISTS | 找最大分区 vs 判断指定分区 |
PARTITION_EXISTSvsTABLE_EXISTS | 判断分区 vs 判断表 |
STR_TO_MAPvsMAP | 字符串解析 MAP vs 直接构造 MAP |
STACKvsTRANS_ARRAY | 静态值拆行 vs 分隔字符串拆行 |
TRANS_ARRAYvsTRANS_COLS | 单列数组字符串拆行 vs 多列转多行 |
UNIQUE_IDvsUUID | 更高效随机 ID vs 标准随机 UUID |
十三、常用案例
1、NULL兜底
-- unit_price 为空时取 fixed_priceSELECTNVL(unit_price,fixed_price)ASunit_priceFROMsms_price;2、多级兜底
-- 优先取 t1,其次 t2,最后取 0SELECTCOALESCE(t1.unit_price,t2.unit_price,0)ASunit_priceFROMsource_table;3、安全转换数字
-- 非法数字返回 NULL,不中断任务SELECTSAFE_CAST(price_strASDOUBLE)ASpriceFROMsource_table;4、最新分区
SELECT*FROMudi.src_shop_dfWHEREds=MAX_PT('udi.src_shop_df');5、条件分类
SELECTCASEWHENamount>=1000THEN'高'WHENamount>=500THEN'中'ELSE'低'ENDASamount_levelFROMorder_table;6、生成Data ID
SELECTUUID()ASdata_id,shop_id,shop_nameFROMshop_table;7、判断表是否存在
SELECTTABLE_EXISTS('udi.src_shop_df')ASis_exists;8、字符串转MAP
-- 结果:{platform:美团,city:北京}SELECTSTR_TO_MAP('platform:美团,city:北京',',',':')ASresult;十四、参考资料
阿里云 MaxCompute 官方文档:
https://help.aliyun.com/zh/maxcompute/other-functions