You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:05:09