Presto SQL分割字符串如何获取最后一个分隔符前的全部内容
Presto 提取斜杠分隔字符串最后一个分隔符前的内容
你提到的「先定位最后一个'/'的位置再截取」的思路完全可行,Presto中可以通过内置函数直接实现,不需要依赖复杂的嵌套反转逻辑。
方法1:定位最后一个'/'的位置后截取
Presto没有直接提供「查找字符最后一次出现位置」的函数,可以通过反转字符串的方式间接计算位置,再用substr完成截取,语句如下:
SELECT substr( column_name, 1, length(column_name) - strpos(reverse(column_name), '/') ) AS target_content FROM your_table;
逻辑说明:
- 先将原字符串反转,通过
strpos拿到反转后第一个'/'的位置,这个值等价于原字符串中最后一个'/'距离字符串末尾的偏移量 - 用原字符串总长度减去这个偏移量,就能得到最后一个'/'在原字符串中的下标位置
- 从字符串第一位开始截取到该下标前一位,就能得到最后一个'/'之前的全部内容,对示例值
Hello/Hi/Howdy/Bye会返回预期的Hello/Hi/Howdy
注意:你提到的把位置索引传入split_part()的写法无法实现需求,因为split_part()的第三个参数是指定「取拆分后的第几个分段」,不是按字符位置截断,无法直接返回前面所有分段拼接的结果。
方法2:正则替换(更简洁)
不需要计算位置,直接用正则匹配最后一个'/'和它后面的所有内容,替换为空即可,写法更简洁:
SELECT regexp_replace(column_name, '/[^/]*$', '') AS target_content FROM your_table;
逻辑说明:
- 正则中
$匹配字符串结尾,[^/]*匹配连续的非'/'字符 - 整体匹配的内容就是「字符串末尾处最后一个'/' + 后面跟着的最后一个分段内容」,替换为空后剩下的就是需要的结果
两种写法对「字符串中不存在'/'」的边界场景都会直接返回原字符串,不会抛出异常。
内容的提问来源于stack exchange,提问作者user7298979
相关产品推荐
相关产品推荐

