首页 / 字符串
SUBSTR 截取子串
SUBSTR 从指定位置截取字符串。各引擎都从 1 开始计数,负数表示从末尾倒数;起始位置写 0 时,多数引擎返回空字符串。Hologres 的 SUBSTR 需要 orafce 扩展,标准写法是 SUBSTRING。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | SUBSTR(str, start_position[, length]) |
从 1 开始计数,负数从末尾倒数。start_position 为 0 时返回空字符串;Hive 兼容模式和 BigQuery 兼容模式下按 1 处理。length 为 0 或负数时返回空字符串。 | 官方文档 |
| Hologres | 需改写 | SUBSTRING(str FROM start FOR len) |
SUBSTR 是 Oracle 兼容函数,需要先加载 orafce 扩展。PostgreSQL 标准写法是 SUBSTRING。 | 官方文档 |
| StarRocks | 支持 | substr(str, pos[, len]) |
substr 和 substring 是同一个函数。从 1 开始计数,负数从末尾倒数,pos 为 0 或超出长度时返回空字符串。 | 官方文档 |
| Doris | 支持 | SUBSTRING(str, pos[, len]) |
别名 SUBSTR。从 1 开始计数,负数从末尾倒数,pos 为 0 或超出长度时返回空字符串,任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Hive | 支持 | substr(str, start[, len]) |
substr('foobar', 4) 返回 bar。手册没有说明负数和 0 的处理。 | 官方文档 |
| Spark SQL | 支持 | substr(str, pos[, len]) |
Spark 1.5.0 起提供,与 substring 相同。负数从末尾倒数:substr('Spark SQL', -3) 返回 SQL。 | 官方文档 |
| Flink SQL | 支持 | SUBSTR(string, integer1[, integer2]) |
也可以写 SUBSTRING。省略长度时截取到末尾。 | 官方文档 |
迁移注意事项
- 起始位置写 0 是常见错误。MaxCompute 默认、StarRocks 和 Doris 都返回空字符串,不会报错,结果却全是空值,很难发现。MaxCompute 开启 Hive 兼容模式后又会按 1 处理,同一条 SQL 在不同模式下结果不同。
- Hologres 直接写 SUBSTR 可能报函数不存在,需要先创建 orafce 扩展,或改用标准的 SUBSTRING。
示例
取日期字符串中的年月
SELECT SUBSTR(biz_date, 1, 7) FROM orders;SELECT SUBSTRING(biz_date FROM 1 FOR 7) FROM orders;SELECT substr(biz_date, 1, 7) FROM orders;