跳到主要内容

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 标准语法

参数说明

参数类型说明
strSTRING源字符串表达式,或字节数组
posINT起始位置(从 1 开始)。如果为负数,则从字符串末尾反向计数
lenINT可选。要截取的字符长度。如果未指定,则截取从 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真题

交流微信二维码

你可能还想看