首页 / 字符串
SPLIT_PART 按分隔符取第 N 段
SPLIT_PART 按分隔符切分字符串,返回第 N 段,下标从 1 开始。多数引擎同名可用,但下标越界时有的返回空字符串,有的返回 NULL;Hive 要用 split 加数组下标改写,Flink 的 SPLIT_INDEX 下标从 0 开始。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | SPLIT_PART(str, delimiter, start[, end]) | 下标从 1 开始,必须是大于 0 的常量。传入 end 时返回 start 到 end 段,并保留中间的分隔符。下标越界返回空字符串,分隔符为空字符串时返回原串,任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Hologres | 支持 | SPLIT_PART(str, delimiter, num) | 下标从 1 开始。num 超出分段数量时返回 NULL。 | 官方文档 |
| StarRocks | 支持 | split_part(content, delimiter, field) | 正数从开头数,负数从末尾数,-1 表示最后一段。下标越界时,官方示例返回空字符串。 | 官方文档 |
| Doris | 支持 | SPLIT_PART(str, separator, part_index) | 下标从 1 开始。part_index 为 0 或越界时返回 NULL,任一参数为 NULL 时也返回 NULL。 | 官方文档 |
| Hive | 需改写 | split(str, pat)[n - 1] | 内置函数中没有 SPLIT_PART。split 的第二个参数是正则表达式,返回数组,数组下标从 0 开始。 | 官方文档 |
| Spark SQL | 支持 | split_part(str, delimiter, partNum) | Spark 3.3.0 起提供。下标从 1 开始,负数从末尾数。越界返回空字符串,partNum 为 0 时报错,分隔符为空字符串时不切分。 | 官方文档 |
| Flink SQL | 需改写 | SPLIT_INDEX(str, delimiter, n - 1) | 下标从 0 开始。下标为负数或任一参数为 NULL 时返回 NULL。 | 官方文档 |
迁移注意事项
- 下标越界时结果不同:MaxCompute、StarRocks 和 Spark 返回空字符串,Hologres 和 Doris 返回 NULL。下游用 IS NULL 或 = '' 判断时,迁移后结果可能变化。
- Hive 的 split 按正则切分。分隔符是 .、| 这类正则特殊字符时,要写成 split(s, '\\.'),否则结果不对。
- Hive 的数组下标和 Flink 的 SPLIT_INDEX 都从 0 开始。从 SPLIT_PART 改写时要把下标减 1。
- 取最后一段时,StarRocks 和 Spark 可以直接传 -1。MaxCompute 要求下标大于 0,不能这样写。
- MaxCompute 的四参数写法 SPLIT_PART(s, ',', 1, 2) 在其他引擎中没有对应写法,需要改成多段拼接。
示例
从 a,b,c 中取第 2 段
SELECT SPLIT_PART(tags, ',', 2) FROM items;SELECT SPLIT_PART(tags, ',', 2) FROM items;SELECT split_part(tags, ',', 2) FROM items;SELECT SPLIT_PART(tags, ',', 2) FROM items;SELECT split(tags, ',')[1] FROM items;SELECT split_part(tags, ',', 2) FROM items;SELECT SPLIT_INDEX(tags, ',', 1) FROM items;