substr:截取子串
速查结论
substr(str, pos[, len]) 是 Spark SQL 中用于从指定位置截取子字符串的函数。
语法
substr(str, pos[, len])
substr(str FROM pos[ FOR len]])
两种语法等价:
substr(str, pos, len)—— 标准函数调用语法substr(str FROM pos FOR len)—— SQL 标准语法
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| str | STRING | 源字符串表达式,或字节数组 |
| pos | INT | 起始位置(从 1 开始)。如果为负数,则从字符串末尾反向计数 |
| len | INT | 可选。要截取的字符长度。如果未指定,则截取从 pos 到字符串末尾的所有字符 |
示例
> SELECT substr('Spark SQL', 5);
k SQL
> SELECT substr('Spark SQL', -3);
SQL
> SELECT substr('Spark SQL', 5, 1);
k
> SELECT substr('Spark SQL' FROM 5);
k SQL
> SELECT substr('Spark SQL' FROM -3);
SQL
> SELECT substr('Spark SQL' FROM 5 FOR 1);
k
> SELECT substr(encode('Spark SQL', 'utf-8'), 5);
k SQL
常见报错与避坑指南
- 位置从 1 开始:
substr的 pos 参数从 1 开始计数(而非 0)。substr('hello', 1, 1)返回h。这与许多编程语言(Java、Python)的 0-based 索引不同。 - 负数 pos 从末尾反向计数:
substr('hello', -2)返回lo(最后两个字符)。注意substr('hello', -2, 1)返回l(从倒数第二个字符开始取 1 个)。 - pos 为 0 的行为:
substr(str, 0)返回空字符串(等同于substr(str, 0, 0)),而不是从开头截取。这与 Oracle 数据库中 0 和 1 等价的行为不同,需特别注意。 - 字节数组支持:
substr也支持字节数组(Binary 类型)作为输入,处理逻辑与字符串一致。
Since: 1.5.0
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
