首页 / 字符串
SUBSTRING_INDEX 按分隔符截取
SUBSTRING_INDEX(str, delim, count) 返回第 count 个分隔符之前的部分,count 为负数时从右边数。MaxCompute、StarRocks、Doris、Hive 和 Spark 同名可用,count 为 0 时结果不同;Hologres 和 Flink 没有这个函数。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | SUBSTRING_INDEX(str, separator, count) | MaxCompute 2.0 扩展函数。count 为正从左边截取,为负从右边截取。任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Hologres | 不支持 | — | 字符串函数中没有 SUBSTRING_INDEX。只取某一段时可以用 SPLIT_PART。 | 官方文档 |
| StarRocks | 支持 | substring_index(str, delimiter, count) | 3.2 起提供。count 为 0 时返回 NULL,超过分隔符个数时返回整个字符串。 | 官方文档 |
| Doris | 支持 | SUBSTRING_INDEX(content, delimiter, field) | field 为 0 时返回空字符串。分隔符不存在时返回原字符串,分隔符为空字符串时返回空字符串。 | 官方文档 |
| Hive | 支持 | substring_index(string A, string delim, int count) | Hive 1.3.0 起提供。 | 官方文档 |
| Spark SQL | 支持 | substring_index(str, delim, count) | Spark 1.5.0 起提供,按区分大小写的方式匹配分隔符。 | 官方文档 |
| Flink SQL | 不支持 | — | 内置函数中没有 SUBSTRING_INDEX。只取某一段时可以用 SPLIT_INDEX,下标从 0 开始。 | 官方文档 |
迁移注意事项
- count 为 0 时结果不同:StarRocks 返回 NULL,Doris 返回空字符串,其他引擎文档没有说明。
- StarRocks 3.2 才提供 SUBSTRING_INDEX,更早的版本需要改写。
- Hologres 和 Flink 没有这个函数。只取某一段可以改用 Hologres 的 SPLIT_PART 或 Flink 的 SPLIT_INDEX;要取“前两段”这种跨分隔符的结果,需要拼接或用正则改写。
- 从 URL 中取域名这类场景常写成 substring_index(substring_index(url, '/', 3), '/', -1),嵌套写法在 Hologres 和 Flink 中要整体改写。
示例
取邮箱的用户名部分
SELECT SUBSTRING_INDEX(email, '@', 1) AS username FROM users;SELECT SPLIT_PART(email, '@', 1) AS username FROM users;SELECT substring_index(email, '@', 1) AS username FROM users;SELECT SUBSTRING_INDEX(email, '@', 1) AS username FROM users;SELECT substring_index(email, '@', 1) AS username FROM users;SELECT substring_index(email, '@', 1) AS username FROM users;SELECT SPLIT_INDEX(email, '@', 0) AS username FROM users;