PostgreSQL中如何按倒数第3个下划线截取字符串?
PostgreSQL提取文件名末尾指定片段的解决方法
你的问题出在原SQL的逻辑上:charindex是SQL Server的函数,PostgreSQL中对应的是strpos,而且这个写法只会提取最后一个下划线之后的内容,所以得到的是'A'而非预期的'Plan_A'。下面提供两种可行的解决方式:
方法1:字符串反转+拆分拼接
这种方法通过反转字符串拆分原字符串的最后两个片段,再拼接还原:
SELECT filename, reverse(split_part(reverse(filename), '_', 2)) || '_' || reverse(split_part(reverse(filename), '_', 1)) AS segment, count(1) FROM your_table GROUP BY 1, 2;
逻辑说明:
- 反转
filename后,按下划线拆分出前两个片段(对应原字符串的最后两个部分,比如原字符串末尾的Plan_A反转后是A_nalP,拆分后得到A和nalP) - 分别反转这两个片段再用下划线拼接,得到
Plan_A
方法2:正则表达式替换(更简洁)
利用正则匹配并保留最后两个下划线分隔的片段:
SELECT filename, regexp_replace(filename, '^.*_([^_]+_[^_]+)$', '\1') AS segment, count(1) FROM your_table GROUP BY 1, 2;
逻辑说明:
- 正则
^.*_([^_]+_[^_]+)$会匹配从字符串开头到倒数第二个下划线的所有内容 - 括号内的
[^_]+_[^_]+捕获最后两个由下划线分隔的片段(即你需要的segment) - 替换后直接返回捕获的内容
内容的提问来源于stack exchange,提问作者user14452102
相关产品推荐
相关产品推荐

